你好堆栈溢出社区。
UTF-16 可以是两字节字符集或四字节字符集。
据我了解,四字节字符集由高(16)和低(16)的代理组成。
我知道 UTF-8 可以是一、二、三、四或最多七个字节。
但是我们可以通过查看第一个八位字节中的位轻松判断有多少字节来自 UTF-8。
我想知道我们如何识别来自 UTF-16 和 UTF-32 的字节大小。
感谢您的帮助,并欢迎对 Unicode 提出意见。
谢谢。
东燮
每个代码点使用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,则序列格式错误。
这取决于代码点的值,每个代码点使用2 或 4 个字节。分析前 2 个字节的数值(考虑大/小端)将告诉您序列中有多少总字节,包括前 2 个字节。
如果数值在 0x0000..0xD7FF 或 0xE000..0xFFFF 范围内,则为代码点值。
如果数值在 0xD800..0xDBFF 范围内,则代码点值跨越 4 个字节。前 2 个字节是高代理。接下来 2 个字节的数值必须在低代理的 0xDC00..0xDFFF 范围内,否则序列格式错误。
如果数值在 0xDC00..0xDFFF 范围内,则序列格式错误。
这始终是每个代码点4 个字节。4 个字节的数值(考虑大/小端)是代码点值。