字符串类中 size() 和 at() 的行为不正确

Incorrect behaviour of size() and at() in string class

本文关键字:不正确 at size 字符串      更新时间:2023-10-16

我有这个代码:

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 编码字符串,在这种情况下,是的,字符串的长度(正确)报告为 51,并且第一个代码点可能无法在您的平台上打印。


1) 请注意,string::size计算字节 (= char s),而不是逻辑字符甚至码位。

Windows上的std::string通常用于存储UTF8字符串(这是2010年这一端大多数理智操作系统的默认编码),但它是一个"愚蠢"的容器,从某种意义上说,它不知道或关心你存储的字节。它将适用于阅读、存储和写作;但不适用于字符串操作。

您需要使用优秀且维护良好的 IBM ICU:Unicode 国际组件。它是一个用于 *nix 或 Windows 的 C/C++ 库,其中进行了大量研究以提供区域性感知字符串库,包括快速且准确的不区分大小写的字符串比较。

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