C ++中的Unicode处理


Answers:


81
  • 使用 ICU处理您的数据(或类似的库)
  • 在您自己的数据存储中,确保所有内容都以相同的编码存储
  • 确保您始终将unicode库用于诸如字符串长度,大写状态之类的普通任务。切勿使用标准的库内置函数,is_alpha除非这是所需的定义。
  • 我不能说足够多:如果您关心正确性,请不要迭代a的索引string,请始终使用unicode库来实现。

除非您将string视为二进制数据。
黛咪

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 2014年


5

这是Windows编程的清单:

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

11
除非打算同时进行Unicode和ANSI构建,否则不要使用“ T”字符串,字符和函数。如果仅打算进行Unicode构建,则只需进行常规的宽字符处理即可:L“我的宽字符串” wcslen(L“我的字符串”)等
1800信息

同意,仅在需要通用文本时才使用_T宏,即可以同时为Unicode和Ascii / MBCS进行编码。

1
如果您想同时为C ++字符串使用Unicode和ANSI,请使用诸如typedef std :: basic_string <TCHAR> tString之类的东西;
Serge

嗯,是的,我总是做#ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif,但我更喜欢Serge。
亚当·皮尔斯

4
老实说,我认为UTF16是浪费,将UTF8中的所有编码都简化了,并且与* nix更加兼容。
chacham15 '11

3

查看 C ++中不区分大小写的字符串比较

该问题具有指向Unicode的Microsoft文档的链接:http : //msdn.microsoft.com/zh-cn/library/cc194799.aspx

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

它包含以下小节:

  • 代码页模型
  • Windows中的双字节字符集
  • 统一码
  • 混合环境中的兼容性问题
  • 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,但拆装起来更简单。

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

嵌入式库



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.