【问题标题】:Unicode test strings for unit tests用于单元测试的 Unicode 测试字符串
【发布时间】:2011-05-26 10:01:39
【问题描述】:

我需要一些 Utf32 测试字符串来练习一些跨平台字符串操作代码。我想要一套使用 utf32 utf16 utf8 编码的测试字符串,以验证 BMP 之外的字符可以从 utf32、utf16 代理项、utf8 转换回来。正确。

如果所讨论的字符串不仅由随机字节组成,而且在它们编码的(各种)语言中实际上是有意义的,我总是觉得它更优雅。

【问题讨论】:

    标签: c++ unit-testing unicode


    【解决方案1】:

    虽然这不是您所要求的,但我一直发现此测试文档很有用。

    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”列表,它曾经在维基百科上,但显然在那里被删除了。它仍然在这里可用:

    http://clagnut.com/blog/2380/

    【讨论】:

    • 这正是我想要的!
    • quickbrown.txt 文档引用了 Wiki 上更详尽的列表,但该列表已被删除。不过是here
    【解决方案2】:

    https://github.com/noct/cutf/tree/master/bin

    包括以下文件:

    UTF-8-demo.txt
    big.txt
    quickbrown.txt
    utf8_invalid.txt
    

    【讨论】:

      【解决方案3】:

      要真正测试格式之间所有可能的转换,而不是字符转换(即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 之间转换字符。测试使用如上所示的循环。测试还验证了使用无效字符代码是否被正确捕获。

      【讨论】:

        【解决方案4】:

        你可以通过谷歌搜索找到很多附带的数据(关于 SO...,请查看右列中的此类问题)

        但是,我建议您将测试字符串构建为字节数组。这实际上与“什么数据”无关,只是正确处理了 unicode。

        例如您需要确保不同规范化形式的相同字符串(即即使不是规范形式)仍然比较相等。

        您需要检查字符串长度检测是否可靠(并且可以识别单字节、双字节、三字节和四字节字符)。您将需要检查从头到尾遍历字符串是否符合相同的逻辑。对 unicode 字符的随机访问进行更有针对性的测试。

        这些都是你知道的,我敢肯定。我只是将它们拼写出来以提醒您,您需要完全满足边缘情况的测试数据,即 Unicode 固有的逻辑属性。

        只有这样你才能得到正确的测试数据。


        超出这个范围(技术上正确的 Unicode 处理)是实际的本地化(排序规则、字符集转换等)。我指的是火鸡测试

        以下是有用的链接:

        【讨论】:

          【解决方案5】:

          你可以试试这个(有一些俄语、希腊语、中文等的句子来测试Unicode):

          http://www.madore.org/~david/misc/unitest/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-04
            • 1970-01-01
            • 2010-11-23
            • 1970-01-01
            • 2011-08-01
            • 1970-01-01
            相关资源
            最近更新 更多