unicode - 如何知道 UTF-16 发送给您的字节数

标签 unicode encoding utf-16 utf-32

UTF-16可以是两字节字符集或四字节字符集。

据我了解,四字节字符集由高(16)和低(16)的代理组成。

我知道 UTF-8 可以是 1、2、3、4 或最多 7 个字节。

但是通过查看第一个八位字节中的位,我们可以轻松判断有多少字节来自 UTF-8。

我想知道我们如何识别来自 UTF-16 加 UTF-32 的字节大小。

非常感谢您的帮助并欢迎对 Unicode 提出意见。

最佳答案

UTF-8

每个代码点使用 1、2、3 或 4 个字节,具体取决于代码点的值(RFC 3629 不允许使用 5 个以上字节的变化,以保持与 UTF-16 的兼容性,因为它们可以编码高于 UTF-16 最大代码点 U+10FFFF 的代码点。分析第一个字节的高位将告诉您序列中有多少字节,包括第一个字节:

  1. 如果高位为 0,则该字节的数值就是代码点的值。

  2. 如果高 2 位为 1,高 3 位为 0,则码点值跨越 2 个字节。下一个字节必须将其高位设置为 1,并将其高位第 2 位设置为 0,否则序列格式错误。

  3. 如果高 3 位为 1,高 4 位为 0,则码点值跨越 3 个字节。接下来的 2 个字节必须将其高位设置为 1,并将其高位第 2 位设置为 0,否则序列格式错误。

  4. 如果高 4 位为 1,高 5 位为 0,则码点值跨越 4 个字节。接下来的 3 个字节必须将其高位设置为 1,并将其高位第 2 位设置为 0,否则序列格式错误。

  5. 如果 5 个或更多高位设置为 1,则序列格式错误。


UTF-16

每个代码点使用2 或4 个字节,具体取决于代码点的值。分析前 2 个字节的数值(考虑大端/小端)将告诉您序列中总共有多少字节,包括前 2 个字节。

  1. 如果数值在 0x0000..0xD7FF 或 0xE000..0xFFFF 范围内,则它是代码点值。

  2. 如果数值在 0xD800..0xDBFF 范围内,则代码点值跨越 4 个字节。前 2 个字节是高位代理。对于低代理项,接下来 2 个字节的数值必须在 0xDC00..0xDFFF 范围内,否则序列格式错误。

  3. 如果数值在 0xDC00..0xDFFF 范围内,则序列格式错误。


UTF-32

每个代码点始终为4 字节。 4 个字节的数值(考虑大/小端)是代码点值。

关于unicode - 如何知道 UTF-16 发送给您的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34427249/

相关文章:

java - ByteArrayOutputStream 到 CharBuffer

php - PHP MySQL 站点中的西里尔字母编码问题

android - 使用 "android.util.Base64"和 "org.apache.commons.codec.binary.Base64;"的不同编码

ruby - 从 Ruby 中的 UTF-16 编码文件中读取内容

java - 带有特殊 unicode 字符的 Android ACTION_SEND

perl - 如何使用 Perl 在 Windows 上创建 Unicode 目录?

java - 从带有 UTF-16 BOM 字符的文件中读取文本

c# - 如何判断 "Lowest"编码可能?

java - jsp - 使用 unicode(希伯来字母)发布请求未正确显示

python - 无法将干净的 unicode 文本插入 pandas 中的 DataFrame