在C ++中反转wstring

时间:2016-04-30 09:31:42

标签: c++ utf-8 locale

我需要反转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.

1 个答案:

答案 0 :(得分:1)

您的系统OS X使用UTF-8。因此,您没有理由使用wstringwchar_t。事实上,这就是混乱的来源!

您可以看到,当您在OS X上使用getline()调用wstring时,它根本不会读取宽字符。这些字符实际上每个都是四个字节,但它们保持的值与0-255相同,如果您使用常规的“窄”字符串。因此,当你将西里尔字符传输到你的程序时,你最终会得到一个长度为8的wstring,因为C ++不理解UTF-8,但你的终端确实如此(因此它看起来像终端中的四个字符但是8(C ++)。

关于你的问题的评论者是正确的指出这个问题:How do I reverse a UTF-8 string in place? - 一旦你意识到你根本没有处理广泛的字符串,那就是你真正需要的。