如何使用STL字符串和流读取/存储unicode

Jes*_*der 9 c++ string unicode stl stream

我需要修改我的程序以接受Unicode,这可能来自任何UTF-8和各种UTF-16和UTF-32编码.我对Unicode知之甚少(虽然我读过Joel Spolsky的文章维基百科页面).

现在,我使用的是std::istream和阅读我的输入char通过char,然后存储(必要时)在std::string.我想

  • 修改这个(用很少的努力)来支持上面的编码,和
  • 弄清楚如何测试上面的编码(我有点像白面包美国人,并且真的不知道如何用另一种编码制作样本文本文件),理想情况下
  • 以跨平台的方式做到这一点.

另外,如果可能的话,我想尽可能地节省空间(所以如果我们不需要超过一个字节/字符,我们就不会使用它).根据我的理解,这意味着存储在UTF-8中,这很好,但我不知道这样做的标准字符串(根据我的理解,wchar_t具有实现定义的大小和编码).

小智 2

只要您主要使用标准 ASCII 字符,UTF-8 就可以节省空间。

std::string 对于 UTF-8 没有问题,因为其中没有 0 字节。如果输入字符具有 NULL 字节(如 UTF-32 中那样),您可以告诉 std::string 输入字符有多长。std::string 无法告诉您 UTF-8 字符串有多少个字符,您必须使用外部函数。

另外,还有一个使用 wchar_t 的 std::string 的宽版本,而不是 char,我只是忘记了名字。

boost 中还有一些用于编码之间转换的方面。

您可以使用带有 boost 的标准库。或者您可以使用 C 库中的字符串处理函数。还有Qt、Tcl等编程框架提供的功能。

参见示例:

utf8 codecvt 方面