C+中的Unicode处理+; C++中Unicode处理的最佳实践是什么? < P>这是Windows编程的检查表: “我的字符串”中包含的所有字符串 strlen()等。函数替换为_tcslen()等 使用LPTSTR和LPCTSTR代替char*和const char* 在Dev Studio中启动新项目时,一定要确保在项目属性中选择了Unicode选项 对于C++字符串,使用STD::WString代替STD::String 用于处理数据(或类似库) 在您自己的数据存储中,确保所有内容都以相同的编码存储 请确保您始终使用unicode库执行普通任务,如字符串长度、大小写状态等。切勿使用标准库内置项,如is_alpha,除非这是您想要的定义 我说得再清楚不过了:永远不要迭代字符串的索引如果您关心正确性,请始终使用您的unicode库进行此操作。

C+中的Unicode处理+; C++中Unicode处理的最佳实践是什么? < P>这是Windows编程的检查表: “我的字符串”中包含的所有字符串 strlen()等。函数替换为_tcslen()等 使用LPTSTR和LPCTSTR代替char*和const char* 在Dev Studio中启动新项目时,一定要确保在项目属性中选择了Unicode选项 对于C++字符串,使用STD::WString代替STD::String 用于处理数据(或类似库) 在您自己的数据存储中,确保所有内容都以相同的编码存储 请确保您始终使用unicode库执行普通任务,如字符串长度、大小写状态等。切勿使用标准库内置项,如is_alpha,除非这是您想要的定义 我说得再清楚不过了:永远不要迭代字符串的索引如果您关心正确性,请始终使用您的unicode库进行此操作。,c++,unicode,C++,Unicode,使用IBM的查看 该问题有一个指向Microsoft Unicode文档的链接: 如果您查看该文章旁边MSDN的左侧导航栏,您会发现许多与Unicode函数相关的信息。这是“编码字符”一章的一部分() 它有以下小节: 代码页模型 Windows中的双字节字符集 统一码 混合环境中的兼容性问题 Unicode数据转换 将基于Windows的程序迁移到Unicode 总结 我们公司(和其他公司)使用Taligent最初开发的开源(ICU)库 它处理字符串、区域设置、转换、日期/时间、排序、转换等

使用IBM的

查看

该问题有一个指向Microsoft Unicode文档的链接:

如果您查看该文章旁边MSDN的左侧导航栏,您会发现许多与Unicode函数相关的信息。这是“编码字符”一章的一部分()

它有以下小节:

  • 代码页模型
  • Windows中的双字节字符集
  • 统一码
  • 混合环境中的兼容性问题
  • Unicode数据转换
  • 将基于Windows的程序迁移到Unicode
  • 总结
我们公司(和其他公司)使用Taligent最初开发的开源(ICU)库

它处理字符串、区域设置、转换、日期/时间、排序、转换等


开始,尽管这不是每个人的最佳实践,如果你愿意,你可以编写自己的C++ Unicode例程! 我刚在一个周末做完这件事。我学到了很多,虽然我不能保证它100%没有bug,但我做了很多测试,它似乎工作正常

我的代码在新的BSD许可证下,可在以下位置找到:


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

< P>如果你不关心与以前的C++标准的向后兼容性,那么当前的C++ 11标准已经内置了Unicode支持:

因此,C++中Unicode处理的真正最佳实践是使用内置的设备。但是,对于较旧的代码库来说,这并不总是可能的,因为目前的标准非常新


编辑:澄清一下,C++11支持Unicode,因为它现在支持Unicode文本和Unicode字符串。但是,标准库仅用于Unicode处理和转换。对于您当前的需要,这可能就足够了。然而,如果您现在需要进行大量的繁重工作,那么您可能仍然需要使用类似的方法进行更深入的处理。有一些建议包括对不同编码之间的文本转换提供更强大的支持。我的猜测(和希望)是,这将是下一步的一部分。

如上所述,使用大型系统时,库是最佳选择。然而,有时您确实希望自己处理一些事情(可能是因为库会使用很多资源,比如微控制器)。在这种情况下,您需要一个简单的库,可以从中复制零件以满足实际需要

Willow Schlanger的示例代码似乎是一个很好的代码(有关更多详细信息,请参见他的答案)

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

下面列出了一些看起来不错的嵌入式库

嵌入式库
  • (UTF8、UTF16LE、UTF16BE、UTF32)
  • (UTF8)
  • (简单的UTF8库)

看看的建议,不要使用“T”字符串、字符和函数,除非您打算同时使用Unicode和ANSI版本。如果你只想做Unicode构建,只要做普通的宽字符的东西:L“我的宽字符串”WCSCLN(L“我的字符串”)ETCCOND,如果你想要通用文本,即使用Unicode和ASCII/McCs的代码,只使用T宏,如果你想同时使用Unicode和ANSI,C++字符串使用的东西比如TyBuffsST::Basic字符串String;啊,是的,我总是这样做,ifdef,UNICODE,define tstring std::wstring,else,define tstring std::string,endif,但我更喜欢你的方式Serge,说实话,我认为UTF16是一种浪费,将所有编码保留在UTF8中更简单,并且与*nix更兼容。如果不参考描述您正在讨论的“内置Unicode支持”的特定部分,那么链接到标准文档草稿就没有多大帮助。@BenCollins第2.14.5节“字符串文字”-讨论字符串文字,包括UTF-8的字符串文字,UTF-16和UTF-32编码。第22.4.1.4节“类模板codecvt”-讨论用于在字符编码(包括UTF-8、UTF-16和UTF-32)之间转换的codecvt类。在整个文档中都有关于Unicode支持的更多内容,但这些似乎是关于这个主题的最关键部分。除非您将
字符串
视为二进制数据。