
上QQ阅读APP看书,第一时间看更新
4.1 字符串
字符串是一种可以表示文本的数据类型。Nginx是由C语言实现的,C语言并没有字符串类型,但可以用下面两种方式来定义字符串。
char str1[] = "hello";// 字符数组,str1的指向不能变,但数组的内容可以变 char *str2 = "world"; // 字符指针,可以改变str2的指向
这两种定义字符串的方法区别如下。
1)str1是一个字符数组类型,可以对str1[i]进行赋值。
2)str2是一个指针变量,它的内容是world这个字符串的地址。它指向的字符串值是不能改变的,即不可以对str2[i]进行赋值。
我们知道,C语言字符串是以‘\0’作为结尾的,是一种非二进制安全的字符串,即字符串遇到‘\0’便会结束。字符串长度为实际字节数量加‘\0’所占的字节(strlen函数不统计最后的‘\0’这一字节)。网络传输的字节流需要满足双方约定的协议(一般包括对类型、长度、值三种结构的约定),字节流中可能会出现‘\0’,如果用C语言原生字符串来存储网络字节流,显然会出现字符串被截断的情况。为了解决这个问题,Nginx对字符串进行了简单的封装。
Nginx中字符串结构体的定义如下:
typedef struct { size_t len; u_char *data; } ngx_str_t;
可以看到,字段len记录字符串的长度,data指向真正的字符串空间。在访问字符串时,从data指向的位置读取len字段内容,这个内容就是字符串的长度值,通过这种方式可以解决字符串被‘\0’截断的问题。
Nginx通过表4-1所提供的宏对字符串进行设置、修改和获取。
表4-1 Nginx提供的字符串处理相关的宏

除了通过一些宏定义来处理字符串外,Nginx还提供一些函数来处理字符串,例如字符串转大写、小写等函数。这些函数比较简单,这里不再一一赘述。