【问题标题】:how to know how many bytes UTF-16 send to you如何知道 UTF-16 发送给您的字节数
【发布时间】:2016-03-29 09:22:58
【问题描述】:
你好堆栈溢出社区。p>
UTF-16 可以是两字节字符集或四字节字符集。
据我了解,四字节字符集由高 (16) 和低 (16) 的代理组成。
我知道 UTF-8 可以是 1、2、3、4 或最多 7 个字节。
但我们可以通过查看第一个八位字节中的位轻松判断有多少字节来自 UTF-8。
我想知道我们如何识别来自 UTF-16 和 UTF-32 的字节大小。
感谢您的帮助并欢迎对 Unicode 提出意见。
谢谢。
东燮
【问题讨论】:
标签:
unicode
encoding
utf-16
utf-32
【解决方案1】:
UTF-8
每个代码点使用 1、2、3 或 4 个字节,具体取决于代码点的值(RFC 3629 不允许 5+ 字节变化,以保持与 UTF-16 的兼容性,因为它们可以编码高于 UTF-16 的最大代码点 U+10FFFF 的代码点)。分析第一个字节的高位将告诉您序列中有多少字节,包括第一个字节:
-
如果高位为 0,则字节的数值就是代码点的值。
-
如果高 2 位为 1,高 3 位为 0,则代码点值跨越 2 个字节。下一个字节的高位必须设置为 1,并且其高 2 位必须设置为 0,否则序列格式错误。
-
如果高 3 位为 1,高 4 位为 0,则代码点值跨越 3 个字节。接下来的 2 个字节必须将其高位设置为 1,并将其高 2 位设置为 0,否则序列格式错误。
-
如果高 4 位为 1,高 5 位为 0,则代码点值跨越 4 个字节。接下来的 3 个字节必须将其高位设置为 1,并将其高位 2 位设置为 0,否则序列格式错误。
-
如果 5 个或更多高位设置为 1,则序列格式错误。
UTF-16
每个代码点使用 2 或 4 个字节,具体取决于代码点的值。分析前 2 个字节的数值(考虑大/小端)将告诉您序列中有多少总字节,包括前 2 个字节。
-
如果数值在 0x0000..0xD7FF 或 0xE000..0xFFFF 范围内,则为码点值。
-
如果数值在 0xD800..0xDBFF 范围内,则代码点值跨越 4 个字节。前 2 个字节是高代理。接下来 2 个字节的数值必须在低代理的 0xDC00..0xDFFF 范围内,否则序列格式错误。
-
如果数值在 0xDC00..0xDFFF 范围内,则序列格式错误。
UTF-32
这始终是每个代码点 4 个字节。 4 个字节的数值(考虑大/小端)是代码点值。