5

我有这个代码:

string test("żaba");

cout << "Word: " << test << endl;
cout << "Length: " << test.size() << endl;
cout << "Letter: " << test.at(0) << endl;

输出很奇怪:

Word: żaba
Length: 5
Letter: �

如您所见,长度应为 4 和字母:“ż”。

如何更正此代码以正常工作?

4

2 回答 2

6

你的问题没有提到编码,所以我要在黑暗中刺一下,说这就是原因。

第一个行动方案:阅读每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

在那之后,应该清楚的是,不存在“裸字符串”这样的东西——每个字符串都以某种方式编码。在您的情况下,它看起来非常像您使用带有变音符号的 UTF-8 编码字符串,在这种情况下,是的,字符串的长度(正确)报告为 5 1,并且第一个代码点可能不是可在您的平台上打印。


1)注意string::size计算字节(= chars),而不是逻辑字符甚至代码点。

于 2012-05-13T09:58:26.273 回答
5

std::string在非 Windows 上通常用于存储 UTF8 字符串(这是 2010 年大多数理智操作系统上的默认编码),但它是一个“哑”容器,从某种意义上说,它不知道也不关心您存储的字节数。它可以用于读取、存储和写入;但不适用于字符串操作。

您需要使用优秀且维护良好的IBM ICU : International Components for Unicode。它是一个用于 *nix 或 Windows 的 C/C++ 库,已经进行了大量研究以提供一个文化感知字符串库,包括既快速又准确的不区分大小写的字符串比较。

另一个更容易为 C++ 开发人员切换到的好项目是UTF8-CPP

于 2012-05-13T09:59:52.520 回答