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

Dan*_*ski 5 c++

我有这个代码:

string test("?aba");

cout << "Word: " << test << endl;
cout << "Length: " << test.size() << endl;
cout << "Letter: " << test.at(0) << endl;
Run Code Online (Sandbox Code Playgroud)

输出很奇怪:

Word: ?aba
Length: 5
Letter: ?
Run Code Online (Sandbox Code Playgroud)

如您所见,长度应为4,字母为"ż".

如何更正此代码才能正常工作?

Kon*_*lph 6

你的问题没有提到编码,所以我将在黑暗中采取刺,并说这就是原因.

第一个行动方案:阅读绝对最低每个软件开发人员,绝对必须知道Unicode和字符集(没有借口!).

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


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


Mah*_*dsi 5

std::string在非Windows上通常用于存储UTF8字符串(在2010年这个方面是大多数理智的操作系统的默认编码),但它是一个"哑"的容器,在某种意义上它不知道或不关心你要存储的字节数.它适用于阅读,存储和写作; 但不适合字符串操作.

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

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

  • 无论如何,这就是`std:string`:只是一个带有一些面向对象的字符串操作函数的美化字符向量.为什么我会丢弃UTF8引用,如果问题是什么(在`std :: string`中存储unicode字符串的问题)?无论它是否优雅,`std :: string`**用于存储UTF8编码的字符串(是的,有更好的选择).更新的帖子包括UTF8-CPP. (4认同)