【问题标题】:Unicode Processing in C++C++ 中的 Unicode 处理
【发布时间】:2010-09-08 12:16:17
【问题描述】:

在 C++ 中处理 Unicode 的最佳实践是什么?

【问题讨论】:

    标签: c++ unicode


    【解决方案1】:
    • 使用ICU 处理您的数据(或类似的库)
    • 在您自己的数据存储中,确保所有内容都以相同的编码存储
    • 确保始终将 unicode 库用于字符串长度、大小写状态等普通任务。切勿使用 is_alpha 等标准库内置函数,除非这是您想要的定义。
    • 我说的还不够:如果您关心正确性,请永远不要遍历 string 的索引,为此请始终使用您的 unicode 库。

    【讨论】:

    • 除非您将string 视为二进制数据。
    【解决方案2】:

    如果您不关心与以前的 C++ 标准的向后兼容性,当前的 C++11 标准已经内置了 Unicode 支持:http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3242.pdf

    因此,在 C++ 中进行 Unicode 处理的真正最佳实践是使用内置工具。不过,旧代码库并不总是有这种可能性,因为目前标准还很新。

    编辑:澄清一下,C++11 支持 Unicode,因为它现在支持 Unicode 文字和 Unicode 字符串。但是,标准库只有limited support 用于Unicode 处理和转换。对于您当前的需求,这可能就足够了。但是,如果您现在需要做大量繁重的工作,那么您可能仍需要使用 ICU 之类的东西来进行更深入的处理。有一些建议 currently in the works 包括对不同编码之间的文本转换的更强大的支持。我的猜测(和希望)是这将成为下一个 technical report 的一部分。

    【讨论】:

    • 如果没有参考描述您正在讨论的“内置 Unicode 支持”的特定部分,那么指向标准文档草案的链接并不是很有帮助。
    • @BenCollins 第 2.14.5 节“字符串文字” - 讨论字符串文字,包括 UTF-8、UTF-16 和 UTF-32 编码的字符串文字。 Section 22.4.1.4 "Class template codecvt" - 讨论用于在字符编码(包括 UTF-8、UTF-16 和 UTF-32)之间转换的 codecvt 类。整个文档中都有更多关于 Unicode 支持的内容,但这些似乎是该主题最关键的部分。
    【解决方案3】:

    我们公司(和其他公司)使用最初由 Taligent 开发的开源 Internation Components for Unicode (ICU) 库。

    它处理字符串、语言环境、转换、日期/时间、排序规则、转换等。人。

    ICU Userguide开头

    【讨论】:

      【解决方案4】:

      这是一个 Windows 编程清单:

      • _T("my string") 中包含的所有字符串
      • strlen() 等函数替换为 _tcslen() 等。
      • 使用 LPTSTR 和 LPCTSTR 代替 char * 和 const char *
      • 在 Dev Studio 中启动新项目时,请务必确保在项目属性中选择了 Unicode 选项。
      • 对于 C++ 字符串,使用 std::wstring 代替 std::string

      【讨论】:

      • 请勿使用“T”字符串、字符和函数,除非您打算同时进行 Unicode 和 ANSI 构建。如果您只打算进行 Unicode 构建,只需执行常规宽字符:L"my wide string" wcslen(L"my string") 等
      • 同意,仅当您需要通用文本时才使用 _T 宏,即能够同时编码 Unicode 和 Ascii/MBCS。
      • 如果你想为 C++ 字符串同时使用 Unicode 和 ANSI,请使用 typedef std::basic_string tString;
      • 啊,是的,我总是这样做 #ifdef _UNICODE #define tstring std::wstring #else #define tstring std::string #endif 但我更喜欢你的方式 Serge。
      • 老实说,我认为 UTF16 是一种浪费,将所有编码保留在 UTF8 中更简单,并且与 *nix 更兼容。
      【解决方案5】:

      看看 Case insensitive string comparison in C++

      该问题有一个指向 Microsoft Unicode 文档的链接:http://msdn.microsoft.com/en-us/library/cc194799.aspx

      如果您查看该文章旁边的 MSDN 左侧导航栏,您应该会发现很多与 Unicode 函数有关的信息。它是“编码字符”一章的一部分 (http://msdn.microsoft.com/en-us/library/cc194786.aspx)

      它有以下小节:

      • 代码页模型
      • Windows 中的双字节字符集
      • Unicode
      • 混合环境中的兼容性问题
      • Unicode 数据转换
      • 将基于 Windows 的程序迁移到 Unicode
      • 总结

      【讨论】:

        【解决方案6】:

        虽然这可能不是每个人的最佳实践,但您可以根据需要编写自己的 C++ UNICODE 例程!

        我刚刚完成了一个周末。我学到了很多东西,虽然我不能保证它 100% 没有错误,但我做了很多测试,它似乎可以正常工作。

        我的代码在新 BSD 许可下,可以在这里找到:

        http://code.google.com/p/netwidecc/downloads/list

        它被称为 WSUCONV,并带有一个示例 main() 程序,可在 UTF-8、UTF-16 和标准 ASCII 之间进行转换。如果你扔掉主要代码,你就有了一个很好的读/写 UNICODE 的库。

        【讨论】:

          【解决方案7】:

          如上所述,在使用大型系统时,库是最好的选择。但是,有时您确实想自己处理事情(可能是因为该库会使用许多资源,例如微控制器上的资源)。在这种情况下,您需要一个简单的库,您可以从中复制部分以获得您实际需要的东西。

          Willow Schlanger 的示例代码似乎不错(有关详细信息,请参阅他的回答)。

          我还发现了另一个代码更小的代码,但缺少完整的错误检查,只处理 UTF-8,但更容易从中取出。

          这是一个看起来不错的嵌入式库列表。

          嵌入式库

          【讨论】:

            【解决方案8】:

            【讨论】:

              【解决方案9】:

              看看UTF-8 Everywhere的推荐

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-03-03
                • 2013-08-21
                • 2020-08-31
                • 1970-01-01
                • 2014-06-14
                • 2011-04-07
                • 1970-01-01
                相关资源
                最近更新 更多