107

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

4

9 回答 9

81
  • 使用 ICU处理您的数据(或类似的库)
  • 在您自己的数据存储中,确保所有内容都以相同的编码存储
  • 确保您始终将 unicode 库用于字符串长度、大小写状态等普通任务。切勿使用标准库内置函数,is_alpha除非这是您想要的定义。
  • 我说的还不够:如果您关心正确性,请永远不要迭代 a 的索引,始终使用您的 unicode 库。string
于 2008-09-11T01:37:17.303 回答
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之类的东西来进行更深入的处理。目前有一些提案正在制定中,以包括对不同编码之间的文本转换的更强大的支持。我的猜测(和希望)是这将成为下一份技术报告的一部分。

于 2012-11-21T01:09:03.840 回答
8

我们公司(和其他公司)使用最初由 Taligent 开发的开源Internation Components for Unicode (ICU) 库。

它处理字符串、语言环境、转换、日期/时间、排序规则、转换等。人。

ICU 用户指南开始

于 2008-09-11T01:46:51.977 回答
5

这是 Windows 编程的清单:

  • _T("my string") 中包含的所有字符串
  • strlen() 等函数替换为 _tcslen() 等。
  • 使用 LPTSTR 和 LPCTSTR 代替 char * 和 const char *
  • 在 Dev Studio 中启动新项目时,请务必确保在项目属性中选择了 Unicode 选项。
  • 对于 C++ 字符串,使用 std::wstring 而不是 std::string
于 2008-09-11T01:33:53.503 回答
3

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

该问题有一个指向 Microsoft Unicode 文档的链接:http: //msdn.microsoft.com/en-us/library/cc194799.aspx

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

它有以下小节:

  • 代码页模型
  • Windows 中的双字节字符集
  • 统一码
  • 混合环境中的兼容性问题
  • Unicode 数据转换
  • 将基于 Windows 的程序迁移到 Unicode
  • 概括
于 2008-09-11T01:40:08.980 回答
2

虽然这可能不是每个人的最佳实践,但如果您愿意,您可以编写自己的 C++ UNICODE 例程!

我刚刚完成了一个周末。我学到了很多东西,虽然我不能保证它 100% 没有错误,但我做了很多测试,它似乎可以正常工作。

我的代码在新 BSD 许可下,可以在这里找到:

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

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

于 2012-03-12T04:10:39.177 回答
1

正如上面所说,在使用大型系统时,库是最好的选择。但是,有时您确实想自己处理事情(可能是因为该库会使用许多资源,例如微控制器上的资源)。在这种情况下,您需要一个简单的库,您可以从中复制部分以获得您实际需要的东西。

Willow Schlanger 的示例代码似乎不错(有关详细信息,请参阅他的答案)。

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

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

嵌入式库

于 2013-02-15T19:15:15.187 回答
0

使用 IBM 的Unicode 国际组件

于 2008-09-11T01:39:07.097 回答
0

看看UTF-8 Everywhere的建议

于 2016-09-23T09:30:58.203 回答