高unicode码点如何表示为两个码点?

高unicode码点如何表示为两个码点?,unicode,Unicode,我发现,像U+10000这样的>2字节unicode码点可以成对编写,比如\uD800\uDC00。它们似乎是从零开始的d,但这就是我所注意到的 这个拆分操作调用了什么?它是如何工作的?UTF-8意味着(用我自己的话来说)最小的处理原子是一个字节(代码单元是1字节长)。我不知道从历史上看,至少从概念上讲,UCS-2和UCS-4 Unicode编码是第一位的,UTF-8/UTF-16似乎解决了UCS-*的一些问题 UCS-2表示每个字符使用2个字节而不是1个字节。这是一种固定长度的编码。正如您所说

我发现,像U+10000这样的>2字节unicode码点可以成对编写,比如
\uD800\uDC00
。它们似乎是从零开始的
d
,但这就是我所注意到的

这个拆分操作调用了什么?它是如何工作的?

UTF-8意味着(用我自己的话来说)最小的处理原子是一个字节(代码单元是1字节长)。我不知道从历史上看,至少从概念上讲,UCS-2和UCS-4 Unicode编码是第一位的,UTF-8/UTF-16似乎解决了UCS-*的一些问题

UCS-2表示每个字符使用2个字节而不是1个字节。这是一种固定长度的编码。正如您所说,UCS-2保存每个代码点的bytestring。问题是有些字符的代码点需要超过2个字节才能存储。因此,UCS-2只能处理Unicode的一个子集(当然范围是U+0000到U+FFFF)

UCS-4对每个字符使用4个字节,显然,它能够存储任何Unicode代码点的位字符串(Unicode范围从U+000000到U+10FFFF)

UCS-4的问题是,超出2字节范围的字符非常罕见,使用UCS-4编码的任何文本都会浪费太多空间。因此,使用UCS-2是一种更好的方法,除非您需要2字节范围以外的字符

但同样,英文文本、源代码文件等大多使用ASCII字符,而UCS-2也有同样的问题:为主要使用ASCII字符的文本浪费太多空间(太多无用的零)

这就是UTF-8的作用。ASCII范围内的字符按原样保存在UTF-8文本中。它只接受每个字符的代码点/ASCII值的位字符串。因此,如果UTF-8编码的文本仅使用ASCII字符,则它与任何其他拉丁1编码都无法区分。不支持UTF-8的客户端可以仅使用ASCII字符处理UTF-8文本,因为它们看起来完全相同。这是一种向后兼容的编码

从那时起(ASCII范围之外的Unicode字符),UTF-8文本使用两个、三个或四个字节来保存代码点,具体取决于字符

我不知道确切的方法,但是比特串被分成两个、三个或四个字节,使用已知的比特前缀来知道用于保存代码点的字节数。如果一个字节以0开头,则表示该字符为ASCII,仅使用1个字节(ASCII范围为7位长)。如果字符以1开头,则根据下一位的不同,使用两个、三个或四个字节对字符进行编码

UTF-8的问题是它需要太多的处理(它必须检查每个字符的前几位以了解其长度),特别是如果文本不像英语。例如,用希腊语编写的文本将主要使用两字节字符

UTF-16使用两个字节的代码单元来解决非ASCII文本的问题。这意味着处理的原子是16位字。如果字符编码不适合两字节代码单元,那么它将使用两个代码单元(四个字节)对字符进行编码。这对两个代码单元称为代理项对。我认为仅使用2字节范围内字符的UTF-16文本等同于使用UCS-2的相同文本


UTF-32又像UCS-4一样使用4字节的代码单元。但是我不知道它们之间的区别。

填写您困惑的完整图片格式如下:

参考我从评论中学到的


U+10000
是一个Unicode(映射到字符的十六进制整数)

是代码点到字符的一对一映射

0xD800
0xDFFF
的代码点的包含范围为UTF-161()代理单元保留(见下文)

\uD800\uDC00
2是两个这样的代理单元,称为。(代理项单元是作为代理项对一部分的代码单元。)

抽象表示:代码点(抽象字符)-->(抽象UTF-16)-->代码单元(UTF-16编码字节)-->解释UTF-16

实际使用示例:输入数据是字节,可以用第二种编码进行包装,如HTML实体的ASCII和unicode转义,或者解析器处理的任何内容
-->
编码解释;通过屏幕上的scheme
-->
字体图示符
-->
字符映射到代码点


代理项对优势:

  • 只有高单位和低单位。高的后面必须跟着低的。没有混乱的高和低单位
  • UTF-16可以为前63487个代码点使用2个字节,因为不能将代理项误认为代码点
  • 2048个代码点的范围是
    (2048/2)**2
    ,以产生1048576个代码点的范围
  • 对使用的字符进行处理

  • 1 UTF-16是唯一使用代理项对的设备。
    2此文件的格式为


    描述字符编码的图形:


    继续阅读:


    UTF定义了如何将码点编码为码单元,码单元的大小可以是7位、8位、16位或32位,具体取决于UTF。UTF-8根据码点的值,使用1、2、3或4个8比特码单元对码点进行编码。UTF-16使用1或2个16位代码单元对一个代码点进行编码,其中2个代码单元共同作用称为代理对。每个UTF都定义了自己的算法,用于将代码点转换为一系列代码单元,反之亦然。阅读UTF规范。简而言之,对于UTF-16,如果一个码点大于0xFFFF,则从中减去0x010000,剩下20位。它们被分成两半,其中高10位添加到0xD800,低10位添加到0xDC00。因此创建了一个代理项对。Unicode从16位标准开始,一直到版本3。当决定