在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议