我需要反转wstring。我有这样的代码:
#include <iostream>
#include <string>
#include <locale>
int main() {
std::wstring s;
std::getline(std::wcin, s);
for (const auto &i : s) {
std::wcout << (int) i << " ";
}
std::wcout << std::endl;
std::wcout << s << std::endl;
std::reverse(s.begin(), s.end());
std::wcout << s << std::endl;
return 0;
}
ANSI字符以1个字节编码,我可以轻松地反转它们:
echo -n "papa" | ./reverse
112 97 112 97
papa
apap
但是当我输入西里尔文本时,编码超过1个字节,我得到这样的输出:
echo -n "папа" | ./reverse
208 191 208 176 208 191 208 176
папа
�пап�
如何正确扭转该字符串?
P.S。我正在使用OS X.
答案 0 :(得分:1)
您的系统OS X使用UTF-8。因此,您没有理由使用wstring
或wchar_t
。事实上,这就是混乱的来源!
您可以看到,当您在OS X上使用getline()
调用wstring
时,它根本不会读取宽字符。这些字符实际上每个都是四个字节,但它们保持的值与0-255相同,如果您使用常规的“窄”字符串。因此,当你将西里尔字符传输到你的程序时,你最终会得到一个长度为8的wstring
,因为C ++不理解UTF-8,但你的终端确实如此(因此它看起来像终端中的四个字符但是8(C ++)。
关于你的问题的评论者是正确的指出这个问题:How do I reverse a UTF-8 string in place? - 一旦你意识到你根本没有处理广泛的字符串,那就是你真正需要的。