我seen>像U + 10000这样的> 2字节unicode代码点可以写成一对,如\uD800\uDC00
。他们似乎从蚕食d
开始,但这就是我所注意到的。
什么是分裂动作,它是如何工作的?
答案 0 :(得分:1)
UTF-8(使用我自己的话)表示最小处理原子是一个字节(代码单元长度为1个字节)。我不知道在历史上,但至少从概念上讲,UCS-2和UCS-4 Unicode编码首先出现,而UTF-8 / UTF-16似乎解决了UCS的一些问题 - *。
UCS-2表示每个字符使用2个字节而不是1个字节。这是一个固定长度的编码。 UCS-2保存每个代码点的字节串。问题是有些字符代码点需要超过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字符,则它与任何其他Latin1编码无法区分。没有UTF-8支持的客户端只能使用ASCII字符处理UTF-8文本,因为它们看起来完全相同。这是一种向后兼容的编码。
从那时起(ASCII范围之外的Unicode字符),UTF-8文本使用两个,三个或四个字节来保存代码点,具体取决于字符。
我不知道确切的方法,但是使用已知的位前缀将bitestring分成两个,三个或四个字节,以了解用于保存代码点的字节数。如果一个字节以0开头,则表示该字符为ASCII且仅使用1个字节(ASCII范围为7位长)。如果以1开头,则使用两个,三个或四个字节对字符进行编码,具体取决于接下来的位数。
UTF-8的问题在于它需要太多的处理(它必须检查每个字符的前几位才能知道它的长度),特别是如果文本不是英文的话。例如,用希腊语编写的文本将主要使用双字节字符。
UTF-16使用双字节代码单元来解决非ASCII文本的问题。这意味着处理的原子是16位字。如果字符编码不适合双字节代码单元,则它使用2个代码单元(4个字节)对字符进行编码。这对两个代码单元称为代理对。我认为只使用2字节范围内的字符的UTF-16文本等同于使用UCS-2的相同文本。
反过来,UTF-32使用4字节代码单元,就像UCS-4那样。我不知道它们之间的区别。答案 1 :(得分:0)
填写混乱的完整图片格式如下:
参考我从评论中学到的东西......
U+10000
是Unicode code point(映射到字符的十六进制整数)。
Unicode是代码点与字符的一对一映射。
从0xD800
到0xDFFF
的代码点的包含范围保留给UTF-16 1 (Unicode vs UTF)代理单位(见下文)。< / p>
\uD800\uDC00
2 是两个这样的代理单位,称为surrogate pair。 (代理单元是代理对的代码单元。)
抽象表示:代码点(抽象字符)-->
Code unit(抽象UTF-16)-->
代码单元(UTF-16编码字节){ {1}}解释UTF-16
实际用法示例:输入数据是字节,可以用第二种编码包装,如HTML实体和unicode转义的ASCII,或解析器处理的任何内容-->
编码解释;通过方案-->
字体字形-->
屏幕上的字符
代理对优势:
-->
,可产生1048576个代码点。 1 UTF-16是唯一使用代理对的UTF。
2 格式为unicode escape sequence。
描述字符编码的图形:
继续阅读: