在C ++中的Unicode处理

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

  • 使用ICU处理您的数据(或类似的库)
  • 在您自己的数据存储中,确保所有内容都以相同的编码存储
  • 确保你总是使用你的unicode库来处理像string长度,大写状态等常见任务。不要使用像is_alpha这样的标准库内buildis_alpha除非是你想要的定义。
  • 我不能说足够的: 如果你关心正确性,永远不要迭代一个string的索引,总是使用你的unicode库。

我们的公司(和其他公司)使用最初由Taligent开发的Unicode开放源码国际组件 (ICU)库。

它处理string,语言环境,转换,date/时间,整理,转换等。 人。

从ICU用户指南开始

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

所以在C ++中处理Unicode的最好的做法是使用内置的工具。 但是,对于较老的代码库来说,这并不总是可行的,目前这个标准是如此新颖。

编辑:澄清,C + + 11是Unicode的意识到,它现在已经支持Unicode文字和Unicodestring。 但是,标准库只对Unicode处理和转换提供有限的支持 。 为了您现在的需要,这可能就够了。 但是,如果您现在需要大量繁重的工作,那么您可能仍然需要使用ICU等更深入的处理。 目前在工作中有一些build议,包括对不同编码之间的文本转换更强大的支持。 我的猜测(和希望)是,这将成为下一个技术报告的一部分 。

这是一个Windows编程清单:

  • 所有包含在_T中的string(“我的string”)
  • strlen()等函数被replace为_tcslen()等
  • 使用LPTSTR和LPCTSTR而不是char *和const char *
  • 在Dev Studio中启动新项目时,请确保在您的项目属性中selectUnicode选项。
  • 对于C ++string,请使用std :: wstring而不是std :: string

在C ++中查看不区分大小写的string比较

该问题链接到Microsoft上的Unicode文档: http : //msdn.microsoft.com/en-us/library/cc194799.aspx

如果您在该文章旁边的MSDN左侧的导航面上查找,则应该可以find有关Unicodefunction的大量信息。 它是“编码字符”一章的一部分( http://msdn.microsoft.com/en-us/library/cc194786.aspx

它有以下小节:

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

虽然这对于每个人来说都不是最佳实践,但是如果你愿意的话,你可以编写你自己的C ++ UNICODE例程!

我刚刚完成了一个周末。 我学到了很多东西,虽然我不能保证它是100%的免费的,但是我做了很多testing,看起来工作正常。

我的代码是根据新的BSD许可证,可以在这里find:

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

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

如上所述,使用大型系统时,图书馆是最好的select。 然而,有时候你想要处理自己的事情(也许是因为图书馆会使用像微控制器上的许多资源)。 在这种情况下,您需要一个简单的库,您可以将部件从您实际需要的东西中复制出来。

Willow Schlanger的示例代码似乎是一个很好的例子(详见他的回答)。

我还发现了另一个代码较小的代码,但是缺less完整的错误检查,只能处理UTF-8,但更简单。

这是一个看起来像样的embedded式库列表。

embedded式库

使用IBM的Unicode国际组件

看看UTF-8无处不在的build议