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 的代码点。分析第一个字节的高位将告诉您序列中有多少字节,包括第一个字节:
如果高位为 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 个字节的数值(考虑大/小端)是代码点值。
关于unicode - 如何知道 UTF-16 发送给您的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34427249/