空字符

来自GSXAB的知识库
空字符
术语名称 空字符
英语名称 null character
别名 null, \0, NUL
空字节
术语名称 空字节
英语名称 null byte
别名 null

空字符(null character)是一个控制字符。这一字符出现在很多字符集中,且码位多数分配为 0 。在 ASCII 中为 0x00 ,在 Unicode 中为 U+0000 Null Character 。需要指代这一字符时,经常缩写为 NUL 或 NULL (后者与空指针空引用有歧义),也被展示为 ␀ 。在 ^ 表示法中表示为 ^@ 。 Basic 语言及相关语言将这个字符记为 vbNullChar , C 语言及相关语言将这个字符记为 \0

空字符在多数字符集的字符编码结果中都是 0 。特殊的是在 MUTF-8 中编码为 0xC0.80

最初这个字符的含义是空操作,对于打印机等不触发任何动作;在打孔纸带上,空字符代表这个字符的位置上没有孔,也可以认为当纸带上没有被打孔任何字符时,纸上被填满了空字符,而且在向纸带上打孔字符时,可以认为是用新字符在原来预留的一段空字符处做覆盖。这一段预留的空字符可能会被预留在中间,而且也无法事先保证长度与要插入的信息相同,因此需要保证这段空字符代表的信息相当于不存在,什么都不做。

由于 C 语言中常常使用空字符结尾字符串形式的字符串,很多语言都继承了在字符串结尾使用空字符标记的特征。这是一种哨兵元素机制,通过一个字节的额外空间开销标记了总长度,而不需要额外记录字符串长度;而且长度也不会因为要使用整型记录字符串长度而被整型的范围限制。

对于二进制存储,或用单字节储存字符时,空字符会导致这一字节内的数据为 0 ,称为空字节(null byte)。

由于不同语言中字符串实现存在差异,有的环境中认为空字符是字符串的结尾,有的环境中用额外的长度数据标记字符串结尾,而且还存在不是字符串的纯二进制数据只能用长度数据确定范围,任何字节数据都无法作为结尾标记,在这些混用的场景下,使用空字符会扰乱对字符串结尾的判断,这称为空字节注入攻击(null byte injection)。