我是专业的 PHP开发人员。
请考虑以下示例:
我想使用 UTF-8 编码对" hello" 这个词进行编码。
所以,
" hello" 一词的每个字母的等效代码点如下:
h = 104
e = 101
l = 108
o = 111
所以,我们可以说十进制数列表代表字符串"你好" :
104 101 108 108 111
UTF-8 编码会存储" hello" ,就像这样(二进制):
01101000 01100101 01101100 01101100 01101111
如果你仔细观察上面的二进制编码值,你就会发现十进制数的每个二进制等价值前面都有二进制位值0
。
我的问题是为什么这个初始0
已经被添加到每个可存储字符的前缀?在UTF-8编码中使用它的目的是什么?
使用 UTF-16 格式编码相同字符串时做了什么?
如果有必要,那么初始额外字符可以是位值1
吗?
NUL Byte 是否表示二进制字符0
?
答案 0 :(得分:1)
UTF-8使用7位对Unicode代码点U + 0000 - U + 007F(ASCII字符0-127)进行编码。第8位用于仅在编码Unicode代码点U + 0080 - U + 10FFFF时需要额外字节时发出信号。
例如,è
是代码点U + 00E8,它以UTF-8编码为字节0xC3 0xA8
(二进制为11000011 10101000
)。
Wikipedia很好地解释了UTF-8是如何编码的。
NUL Byte是否表示二进制字符0?
是
答案 1 :(得分:1)
UTF-8向后兼容ASCII。 ASCII使用值0 - 127并为其分配了字符。这意味着字节0000 0000
到0111 1111
。 UTF-8为前128个字符保留相同的映射。
在ASCII中找不到的任何字符都以UTF-8中1xxx xxxx
的形式编码,即对于任何非ASCII字符,每个编码字节的高位为1
。这些字符以UTF-8编码为多个字节。序列中第一个字节的前几位告诉解码器该字符包含多少字节; 110x xxxx
表示它是一个2字节字符,1110 xxxx
是一个3字节字符,1111 0xxx
是一个4字节字符。序列中的子序列字节采用10xx xxxx
形式。所以,不,你不能随意将它设置为1
。
ASCII有各种扩展(例如ISO-8859),它也设置了第一位,从而添加了1xxx xxxx
形式的另外128个字符。
还有7位ASCII,省略了第一个0
位,只使用000 0000
到111 1111
。
NUL Byte 是否表示二进制字符
0
?
它表示位序列0000 0000
,即带有十进制/十六进制/八进制值0
的全零字节。