UTF16 和 UTF32 解码器架构假设
UTF16 and UTF32 decoder schema assumptions
这个问题与 Construct python 库有关,尽管这不是很重要。
我正在编写一段代码,需要解析 UTF16/32 编码的字符串,没有前缀(类似于 PascalString),后面有任意数据。我需要有人来确认我对这些编码的理解。如果这些假设成立,我知道如何编写解析器。
- UTF16 必须是 2 个字节的倍数,最后一个块(并且只有最后一个)必须是 \x00\x00
- UTF32 必须是 4 字节的倍数,最后一个块(并且只有最后一个)必须是 \x00\x00\x00\x00
我意识到有些代码点不一定是 2 个字节 (UTF16)。
是的,根据定义,UTF-16 必须是 2 字节的倍数,而 UTF-32 必须是 4 字节的倍数。
对于 UTF-32,每个代码点为 4 个字节。对于UTF-16,每个codepoint可能是2个或4个字节,这将由字值决定——0xd800到0xdfff只会出现在4个字节序列中,其余只会出现在2个字节序列中。有关详细信息,请参阅 Wikipedia page on UTF-16。
代码点 0 并未正式排除在 Unicode 之外,因此它可能作为有效序列的一部分出现。不太可能,所以用它来标记字符串的结束也不是没有道理的。
这个问题与 Construct python 库有关,尽管这不是很重要。
我正在编写一段代码,需要解析 UTF16/32 编码的字符串,没有前缀(类似于 PascalString),后面有任意数据。我需要有人来确认我对这些编码的理解。如果这些假设成立,我知道如何编写解析器。
- UTF16 必须是 2 个字节的倍数,最后一个块(并且只有最后一个)必须是 \x00\x00
- UTF32 必须是 4 字节的倍数,最后一个块(并且只有最后一个)必须是 \x00\x00\x00\x00
我意识到有些代码点不一定是 2 个字节 (UTF16)。
是的,根据定义,UTF-16 必须是 2 字节的倍数,而 UTF-32 必须是 4 字节的倍数。
对于 UTF-32,每个代码点为 4 个字节。对于UTF-16,每个codepoint可能是2个或4个字节,这将由字值决定——0xd800到0xdfff只会出现在4个字节序列中,其余只会出现在2个字节序列中。有关详细信息,请参阅 Wikipedia page on UTF-16。
代码点 0 并未正式排除在 Unicode 之外,因此它可能作为有效序列的一部分出现。不太可能,所以用它来标记字符串的结束也不是没有道理的。