gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:31:46 31 4
gpt4 key购买 nike

我已经 seen >2 字节的 unicode 代码点,如 U+10000 可以成对编写,如 \uD800\uDC00。它们似乎以半字节 d 开头,但我只注意到了这一点。

这个 split Action 叫什么,它是如何工作的?

最佳答案

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

UCS-2 表示每个字符使用 2 个字节而不是一个。这是一个固定长度的编码。 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 个代码单元(四个字节)来对字符进行编码。这对两个代码单元称为代理对。我认为仅使用 2 字节范围内的字符的 UTF-16 文本等同于使用 UCS-2 的相同文本。

反过来,UTF-32 使用 4 字节代码单元,就像 UCS-4 一样。虽然我不知道它们之间的区别。

关于unicode - 高 unicode 代码点如何表示为两个代码点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33642339/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com