UTF-8:如何只将0-127存储到一个字节中?

时间:2014-09-27 02:43:20

标签: unicode encoding utf-8

我需要帮助理解" 0-127中的每个代码点是如何存储在一个字节中的#34;引自下文。

以下是上下文:

  因而发明了UTF-8的精彩概念。 UTF-8是另一个   系统用于存储你的Unicode代码点串,那些神奇的U +   数字,在内存中使用8位字节。在UTF-8中,每个代码都来自   0-127存储在单个字节中。仅代码点128及以上   使用2,3存储,实际上最多6个字节。

来源:http://www.joelonsoftware.com/articles/Unicode.html

据我所知,数字0-127是用于表示ASCII字符的数字。 Unicode字符由U + HexHex表示,也就是代码点。 0-127如何转换为代码点?如果每个十六进制数可以表示16个选项,则一个8位字节可以容纳2个十六进制数(2 ^ 8 = 16 * 16 = 256)。

问题:但是有256个字符可以表示,所以为什么要停在127?我可以看到为什么你需要2个字节用于256个代码点以上的字符,但为什么你需要2个字节代码点128-256?

1 个答案:

答案 0 :(得分:3)

作为类比,假设您想要将长文本写入多个页面,并且您需要准确知道文本何时结束。然后你可能会保留右下角的一小部分,上面写着“文字在下一页继续”或“文字在这里结束”。例如:

page 1: This is a very [the text continues on the next page]
page 2: long text that [the text continues on the next page]
page 3: does not fit   [the text continues on the next page]
page 4: on one page.   [the text ends here]

很明显,页面的右下角不能用于普通文本,因为它已被连续标记使用。

当将字节序列转换为代码点序列时,UTF-8使用非常类似的技术。规则是:

  • 如果序列的第一个字节在0到127之间,则其值为代码点。
  • 如果序列的第一个字节介于128和191之间,那就是错误。
  • 如果序列的第一个字节在192和255之间,则它属于几个字节的序列,并且这些字节的一些位用于计算代码点。以下字节必须介于128和191之间。

这意味着每个字节的最高位用作标记,表示“此字节是多字节代码点序列的一部分”。因为该位具有该含义并且不具有任何其他含义,所以仅使用一个字节来表示从0到127的代码点。所有其他代码点需要多个字节。


UTF-8不是将Unicode代码点存储在字节序列中的唯一可能性。您还可以使用以下规则定义编码:

  • 如果第一个字节在0到253之间,则代表其代码点。
  • 如果第一个字节是254,则后面的两个字节用于254到65535范围内的代码点。
  • 如果第一个字节是255,则后面的三个字节用于U + 010000到U + 10FFFF范围内的代码点。

现在,您只需要一个字节用于0到253之间的代码点,但对于所有其他代码点至少需要三个字节,这对于希腊语,西里尔语,东亚语和许多其他语言来说都是浪费。

UTF-8经过精心设计,非常棒。尝试找一些有关它的背景信息,以了解它的美丽。