C ++ 11中支持Unicode的程度如何?

时间:2013-06-14 08:09:05

标签: c++ unicode c++11

我读过并听说C ++ 11支持Unicode。关于这一点的一些问题:

  • C ++标准库如何支持Unicode?
  • std::string会做它应该做的事吗?
  • 我该如何使用它?
  • 潜在问题在哪里?

4 个答案:

答案 0 :(得分:37)

标准库不支持Unicode(支持任何合理含义)。

std::string并不比std::vector<char>好:它完全无视Unicode(或任何其他表示/编码),只是将其内容视为一串字节。

如果你只需要存储和连接blob,它的效果非常好;但是只要你想要Unicode功能(代码点的数量,字母的数量......),你就不幸了。

我唯一知道的综合图书馆就是ICU。 C ++接口虽然源于Java,但它远非惯用语。

答案 1 :(得分:22)

由于Unicode NUL(U + 0000),您可以安全地将UTF-8存储在std::string(或char[]char*中) )是UTF-8中的空字节,这是在UTF-8中出现空字节的唯一方式。因此,您的UTF-8字符串将根据所有C和C ++字符串函数正确终止,并且您可以使用C ++ iostream(包括std::coutstd::cerr来使用它们,只要您的语言环境是UTF-8)。

对于UTF-8,std::string无法做到的是获取代码点的长度。 std::string::size()会告诉你 bytes 中的字符串长度,它只等于你在UTF-8的ASCII子集中的代码点数。

如果你需要在代码点级别操作UTF-8字符串---不仅仅是存储和打印它们 - 或者如果你正在处理UTF-16,它可能有很多内部空字节,您需要查看宽字符串类型。

答案 2 :(得分:6)

C ++ 11有两个new literal string types用于Unicode。

不幸的是,标准库中对非均匀编码(如UTF-8)的支持仍然很糟糕。例如,没有很好的方法来获取UTF-8字符串的长度(在代码点中)。

答案 3 :(得分:3)

但是,有一个名为tiny-utf8的非常有用的库,它基本上是std::string / std::wstring插入式替换。它旨在填补仍然缺少的utf8字符串容器类的空白。

这可能是处理&#39;交易的最舒适方式。使用utf8字符串(即没有unicode规范化和类似的东西)。您可以轻松地对代码点进行操作,而您的字符串仍然以运行长度编码的char进行编码。