我有这个代码:
string test("żaba");
cout << "Word: " << test << endl;
cout << "Length: " << test.size() << endl;
cout << "Letter: " << test.at(0) << endl;
输出很奇怪:
Word: żaba
Length: 5
Letter: �
如您所见,长度应为 4 和字母:“ż”。
如何更正此代码以正常工作?
我有这个代码:
string test("żaba");
cout << "Word: " << test << endl;
cout << "Length: " << test.size() << endl;
cout << "Letter: " << test.at(0) << endl;
输出很奇怪:
Word: żaba
Length: 5
Letter: �
如您所见,长度应为 4 和字母:“ż”。
如何更正此代码以正常工作?
你的问题没有提到编码,所以我要在黑暗中刺一下,说这就是原因。
第一个行动方案:阅读每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有借口!)。
在那之后,应该清楚的是,不存在“裸字符串”这样的东西——每个字符串都以某种方式编码。在您的情况下,它看起来非常像您使用带有变音符号的 UTF-8 编码字符串,在这种情况下,是的,字符串的长度(正确)报告为 5 1,并且第一个代码点可能不是可在您的平台上打印。
1)注意string::size
计算字节(= char
s),而不是逻辑字符甚至代码点。
std::string
在非 Windows 上通常用于存储 UTF8 字符串(这是 2010 年大多数理智操作系统上的默认编码),但它是一个“哑”容器,从某种意义上说,它不知道也不关心您存储的字节数。它可以用于读取、存储和写入;但不适用于字符串操作。
您需要使用优秀且维护良好的IBM ICU : International Components for Unicode。它是一个用于 *nix 或 Windows 的 C/C++ 库,已经进行了大量研究以提供一个文化感知字符串库,包括既快速又准确的不区分大小写的字符串比较。
另一个更容易为 C++ 开发人员切换到的好项目是UTF8-CPP