【发布时间】:2011-05-26 10:01:39
【问题描述】:
我需要一些 Utf32 测试字符串来练习一些跨平台字符串操作代码。我想要一套使用 utf32 utf16 utf8 编码的测试字符串,以验证 BMP 之外的字符可以从 utf32、utf16 代理项、utf8 转换回来。正确。
如果所讨论的字符串不仅由随机字节组成,而且在它们编码的(各种)语言中实际上是有意义的,我总是觉得它更优雅。
【问题讨论】:
标签: c++ unit-testing unicode
我需要一些 Utf32 测试字符串来练习一些跨平台字符串操作代码。我想要一套使用 utf32 utf16 utf8 编码的测试字符串,以验证 BMP 之外的字符可以从 utf32、utf16 代理项、utf8 转换回来。正确。
如果所讨论的字符串不仅由随机字节组成,而且在它们编码的(各种)语言中实际上是有意义的,我总是觉得它更优雅。
【问题讨论】:
标签: c++ unit-testing unicode
虽然这不是您所要求的,但我一直发现此测试文档很有用。
http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
同一网站提供此功能
http://www.cl.cam.ac.uk/~mgk25/ucs/examples/quickbrown.txt
... 相当于英语的“Quick brown fox”文本,它锻炼了所有使用的字符,适用于各种语言。这个页面指的是一个更大的“pangrams”列表,它曾经在维基百科上,但显然在那里被删除了。它仍然在这里可用:
【讨论】:
https://github.com/noct/cutf/tree/master/bin
包括以下文件:
UTF-8-demo.txt
big.txt
quickbrown.txt
utf8_invalid.txt
【讨论】:
要真正测试格式之间所有可能的转换,而不是字符转换(即towupper()、towlower()),您应该测试所有字符。以下循环为您提供了所有这些:
for(wint_t c(0); c < 0x110000; ++c)
{
if(c >= 0xD800 && c <= 0xDFFF)
{
continue;
}
// here 'c' is any one Unicode character in UTF-32
...
}
这样您就可以确保不会遗漏任何内容(即 100% 完成测试。)这只有 1,112,065 个字符,因此在现代计算机上会非常快。
请注意,对于编码之间的基本转换,我上面的循环已经足够了。但是,Unicode 中还有其他功能需要测试一起使用时行为不同的字符对。这里真的没必要。
我现在还有一个单独的C++ libutf8 library 来在 UTF-32、UTF-16 和 UTF-8 之间转换字符。测试使用如上所示的循环。测试还验证了使用无效字符代码是否被正确捕获。
【讨论】:
嗯
你可以通过谷歌搜索找到很多附带的数据(关于 SO...,请查看右列中的此类问题)
但是,我建议您将测试字符串构建为字节数组。这实际上与“什么数据”无关,只是正确处理了 unicode。
例如您需要确保不同规范化形式的相同字符串(即即使不是规范形式)仍然比较相等。
您需要检查字符串长度检测是否可靠(并且可以识别单字节、双字节、三字节和四字节字符)。您将需要检查从头到尾遍历字符串是否符合相同的逻辑。对 unicode 字符的随机访问进行更有针对性的测试。
这些都是你知道的,我敢肯定。我只是将它们拼写出来以提醒您,您需要完全满足边缘情况的测试数据,即 Unicode 固有的逻辑属性。
只有这样你才能得到正确的测试数据。
超出这个范围(技术上正确的 Unicode 处理)是实际的本地化(排序规则、字符集转换等)。我指的是火鸡测试
以下是有用的链接:
【讨论】:
你可以试试这个(有一些俄语、希腊语、中文等的句子来测试Unicode):
【讨论】: