【问题标题】:What does the first bit(i.e. binary 0) mean in UTF-8 encoding standard?UTF-8 编码标准中的第一位(即二进制 0)是什么意思?
【发布时间】:2018-11-17 00:20:45
【问题描述】:

我的职业是 PHP 开发人员

考虑下面的例子:

我想使用 UTF-8 编码对单词 "hello" 进行编码。

所以,

“hello”各个字母的对应码点如下:

h = 104
e = 101
l = 108
o = 111

所以,我们可以说十进制数列表代表字符串"hello"

104 101 108 108 111

UTF-8 编码将像这样(二进制)存储 "hello"

01101000 01100101 01101100 01101100  01101111

如果你仔细观察上面的二进制编码值,你会知道十进制数的每个二进制等价物前面都有二进制位值0

我的问题是为什么这个初始的0 被添加到每个可存储的字符前面?在 UTF-8 编码中使用它的目的是什么?

当使用 UTF-16 格式对相同的字符串进行编码时,会发生什么?

如果有必要,那么最初的额外字符可以是位值1吗?

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

【问题讨论】:

  • 您显示的数字是代码点的十进制表示。实际的代码点是:h = U+0068 (hex 0x68 dec 104), e = U+0065 (hex 0x65 dec 101), l = U+006C (hex 0x6C dec 108), o = U+006F (hex 0x6F dec 111)。代码点 hello 在 UTF-16LE 中编码如下:01101000 00000000 01100101 00000000 01101100 00000000 01101100 00000000 01101111 00000000 和在 UTF-16BE 中:00000000 01101000 00000000 01100101 00000000 01101100 00000000 01101100 00000000 01101111

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


【解决方案1】:

UTF-8 使用 7 位对 Unicode 代码点 U+0000 - U+007F(ASCII 字符 0-127)进行编码。仅当编码 Unicode 代码点 U+0080 - U+10FFFF 时,才需要额外字节时,第八位才会发出信号。

例如,è 是代码点 U+00E8,它以 UTF-8 编码为字节 0xC3 0xA811000011 10101000 二进制)。

Wikipedia 很好地解释了 UTF-8 的编码方式。

NUL Byte 是指二进制字符 0 吗?

是的。

【讨论】:

  • @remy A “轻量级编辑” :-) 好的...现在我的答案肯定更漂亮,但我不会感谢你,因为我认为这不是真的必要 :-)
  • 这不仅仅是让它看起来不错。语法很重要,但使用正确的术语也很重要。如果没有不恰当的名称和表示方式,Unicode 就很难掌握了。
【解决方案2】:

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),它们也设置了第一位,从而添加了另外 128 个 1xxx xxxx 形式的字符。

还有 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感兴趣。

【讨论】:

  • 为什么 ASCII 将额外的位添加到十进制代码点的二进制等效项?
  • 按照典型约定,字节为 8 位。标准 ASCII 正好符合这种期望。同样,7 位 ASCII 明确省略了“多余”位,但在默认情况下期望每字节 8 位的系统中需要特殊处理。
  • 你是说,按照惯例,一个字节由八位组成,系统期望返回由八位组成的相同字节?这就是在开头添加额外位的原因。我做对了吗?
  • 是的,就是这样。
  • extra 0s 用于人类可读性。 01101000 01100101 01101100 01101100 01101111 也可以写成1101000 1100101 1101100 1101100 1101111,但这并不好读,因为字节通常是 8 位大小。无论哪种方式,从计算机的角度来看,高位仍然是0。您不能有未分配的位,位始终为 0 或 1。
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
相关资源
最近更新 更多