UTF-8编码标准中第一位(即二进制0)的含义是什么?

时间:2018-06-07 07:24:14

标签: unicode utf-8 character-encoding utf-16 utf

我是专业的 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

2 个答案:

答案 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 00000111 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 0000111 1111

  

NUL Byte 是否表示二进制字符0

它表示位序列0000 0000,即带有十进制/十六进制/八进制值0的全零字节。

您可能对What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text感兴趣。