用于验证 UTF-8 的 C++ 测试
C++ test for validation UTF-8
我需要为 UTF-8 验证编写单元测试,但我不知道如何在 C++ 中编写不正确的 UTF-8 案例:
TEST(validation, Tests)
{
std::string str = "hello";
EXPECT_TRUE(validate_utf8(str));
// I need incorrect UTF-8 cases
}
如何在 C++ 中编写不正确的 UTF-8 大小写?
您可以使用十六进制形式的 \x
转义序列或八进制形式的 [=12=]0
转义序列指定字符串中的各个字节。
例如:
std::string str = "\xD0";
这是不完整的 UTF8。
查看 https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt 以了解有效和格式错误的 UTF8 测试用例。
在 UTF-8 中,任何最高有效位为 0 的字符都是普通的 ASCII 字符,任何其他字符都是 multi-byte 序列 (MBS) 的一部分。
如果第二个最重要的是另一个,那么这是 MBS 的第一个字节,否则它是 follow-up 个字节之一。
在 MBS 的第一个字节中,随后的最高有效字节数 one-bits 给出了整个序列的字节数,例如。 G。 0b110xxxxx
和 x
的任意值是 two-byte 序列的起始字节。
理论上你现在可以生成最多 7 个字节的序列,目前它们被限制在 4 或 5 个字节(这里不完全确定,你需要查找)。
您现在可以通过定义适当的序列来生成任意代码点,例如"\xc8\x85"
将表示序列 0b11001000 0b10000101
,这是一个合法模式并表示代码点 0b 01000 000101
(注意表示 UTF-8 headers 的前导位是如何被切掉的)对应于一个 0x405 或 1029 的值。如果这是一个有效的代码点,你需要查找,我只是形成了一个任意位模式作为例子。
您现在可以通过增加最重要 one-bits 的数量与适当数量的 follow-up 字节来表示更长的有效序列(再次注意:初始 one-bits 是 总 个字节数 包括 MSB 的第一个字节)。
同样,您现在生成无效序列,使得序列的总字节数与初始字节数不匹配(太多或太少)one-bits。
到目前为止,您可以生成任意有效或无效序列,其中有效序列代表任意代码点。您现在可能需要查找这些代码点中哪些实际上是有效的。
最后,您还可以考虑组合字符(带变音符号)——它们可以表示为一个字符(不是字节!)或规范化的单个字符——如果你想走那么远,那么你需要查找在标准中哪些组合是合法的并且符合哪些规范化代码点。
我需要为 UTF-8 验证编写单元测试,但我不知道如何在 C++ 中编写不正确的 UTF-8 案例:
TEST(validation, Tests)
{
std::string str = "hello";
EXPECT_TRUE(validate_utf8(str));
// I need incorrect UTF-8 cases
}
如何在 C++ 中编写不正确的 UTF-8 大小写?
您可以使用十六进制形式的 \x
转义序列或八进制形式的 [=12=]0
转义序列指定字符串中的各个字节。
例如:
std::string str = "\xD0";
这是不完整的 UTF8。
查看 https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt 以了解有效和格式错误的 UTF8 测试用例。
在 UTF-8 中,任何最高有效位为 0 的字符都是普通的 ASCII 字符,任何其他字符都是 multi-byte 序列 (MBS) 的一部分。
如果第二个最重要的是另一个,那么这是 MBS 的第一个字节,否则它是 follow-up 个字节之一。
在 MBS 的第一个字节中,随后的最高有效字节数 one-bits 给出了整个序列的字节数,例如。 G。 0b110xxxxx
和 x
的任意值是 two-byte 序列的起始字节。
理论上你现在可以生成最多 7 个字节的序列,目前它们被限制在 4 或 5 个字节(这里不完全确定,你需要查找)。
您现在可以通过定义适当的序列来生成任意代码点,例如"\xc8\x85"
将表示序列 0b11001000 0b10000101
,这是一个合法模式并表示代码点 0b 01000 000101
(注意表示 UTF-8 headers 的前导位是如何被切掉的)对应于一个 0x405 或 1029 的值。如果这是一个有效的代码点,你需要查找,我只是形成了一个任意位模式作为例子。
您现在可以通过增加最重要 one-bits 的数量与适当数量的 follow-up 字节来表示更长的有效序列(再次注意:初始 one-bits 是 总 个字节数 包括 MSB 的第一个字节)。
同样,您现在生成无效序列,使得序列的总字节数与初始字节数不匹配(太多或太少)one-bits。
到目前为止,您可以生成任意有效或无效序列,其中有效序列代表任意代码点。您现在可能需要查找这些代码点中哪些实际上是有效的。
最后,您还可以考虑组合字符(带变音符号)——它们可以表示为一个字符(不是字节!)或规范化的单个字符——如果你想走那么远,那么你需要查找在标准中哪些组合是合法的并且符合哪些规范化代码点。