C++中的Unicode处理

109

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

9个回答

81
  • 使用ICU或类似的库处理您的数据
  • 在自己的数据存储中,确保所有内容都以相同的编码方式存储
  • 确保您始终使用Unicode库执行常规任务,例如字符串长度、字母大小写等。除非这正是您想要的定义,否则不要使用标准库内置函数如is_alpha
  • 我再次强调:如果您关心正确性,请永远不要迭代遍历字符串的索引,而是始终使用您的Unicode库。

除非您将“字符串”视为二进制数据。 - Demi

10
如果您不关心与以前的C++标准的向后兼容性,当前的C++11标准已经内置了Unicode支持:http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3242.pdf 因此,在C++中处理Unicode的最佳实践是使用内置的支持。然而,对于旧代码库来说,并不总是可能实现这一点,因为目前该标准还很新。
编辑:澄清一下,C++11是支持Unicode的,因为它现在支持Unicode字面值和Unicode字符串。然而,标准库仅具有有限的支持用于Unicode处理和转换。对于您当前的需求,这可能已经足够了。但是,如果您需要立即执行大量繁重的工作,则可能仍然需要像ICU这样的工具进行更深入的处理。目前正在研究一些提案以包括更强大的文本编码之间的转换的支持。我的猜测(也是希望)是这将成为下一个技术报告的一部分

没有提及描述你所讨论的“内置Unicode支持”的特定部分,那个指向标准草案文档的链接并不是很有帮助。 - Ben Collins
1
@BenCollins第2.14.5节“字符串字面量”-讨论字符串字面量, 包括UTF-8,UTF-16和UTF-32编码的字符串字面量。第22.4.1.4节“类模板codecvt”-讨论用于字符编码之间转换(包括UTF-8,UTF-16和UTF-32)的codecvt类。文档中还有更多关于Unicode支持的内容,但这些似乎是关于该主题最重要的部分。 - eestrada

8
我们的公司(以及其他公司)使用Taligent最初开发的开源Unicode国际组件(ICU)库。
它处理字符串,区域设置,转换,日期/时间,排序,转换等等。
ICU用户指南开始学习。

5

这里是Windows编程的检查清单:

  • 所有字符串都应该用_T("我的字符串")包含
  • 将strlen()等函数替换为_tcslen()等函数
  • 使用LPTSTR和LPCTSTR代替char *和const char *
  • 在Dev Studio中开始新项目时,请确保在项目属性中选择了Unicode选项。
  • 对于C++字符串,请使用std::wstring而不是std::string

11
除非您要同时进行Unicode和ANSI构建,否则请勿使用“T”字符串、字符和函数。如果您只想进行Unicode构建,请使用常规的宽字符处理方式:L"我的宽字符串" wcslen(L"我的字符串")等等 - 1800 INFORMATION
如果你想要通用文本,即能够为Unicode和Ascii/MBCS编码的能力,那么只使用_T宏。同意。 - user2189331
1
如果您想在C++字符串中同时使用Unicode和ANSI,请使用以下类似代码: typedef std::basic_string<TCHAR> tString; - Serge
啊,是的,我总是这样做#ifdef _UNICODE #define tstring std::wstring #else #define tstring std::string #endif但我更喜欢你的方式,Serge。 - Adam Pierce
4
老实说,我认为UTF16是一种浪费,将所有编码保留在UTF8中更简单,而且与*nix更兼容。 - chacham15

3
请看C++中的不区分大小写字符串比较这个问题。
该问题链接到了微软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
  • 摘要

2
尽管这可能不适用于所有人的最佳实践,但如果您想要,您可以编写自己的C ++ UNICODE例程!我在一个周末完成了它。虽然我不能保证它是100%无错误的,但我进行了大量测试,似乎运行正确。我的代码遵循New BSD许可协议,可以在此处找到:http://code.google.com/p/netwidecc/downloads/list。它被称为WSUCONV,并带有一个示例main()程序,可在UTF-8,UTF-16和标准ASCII之间进行转换。如果您放弃主代码,您就拥有一个很好的库来读取/写入UNICODE。

1

如前所述,使用大型系统时,图书馆是最好的选择。但有时您确实希望自己处理事情(可能是因为图书馆会使用太多资源,比如在微控制器上)。在这种情况下,您需要一个简单的图书馆,可以从中复制出真正需要的部分。

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

我还发现另一个代码更小,但缺乏完整的错误检查,并且仅处理UTF-8,但更容易取出部分。

以下是一些看起来不错的嵌入式库的列表。

嵌入式库


0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接