我读过并听说C ++ 11支持Unicode。关于这一点的一些问题:
std::string
会做它应该做的事吗?答案 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::cout
和std::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
进行编码。