C++ C+中的反向wstring+;

C++ C+中的反向wstring+;,c++,utf-8,locale,C++,Utf 8,Locale,我需要把电话倒过来。我有这样的代码: #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 << " "; }

我需要把电话倒过来。我有这样的代码:

#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;
}
但当我输入编码超过1字节的西里尔文文本时,我会得到这样的输出:

echo -n "папа" | ./reverse
208 191 208 176 208 191 208 176
папа
�пап�
我怎样才能正确地反转那个字符串


另外,我正在使用OS X。

您的系统OS X使用UTF-8。因此,您没有理由使用
wstring
wchar\u t
。事实上,这就是困惑的根源

您可以看到,在OSX上使用
wstring
调用
getline()
时,它根本不读取宽字符。这些字符实际上每个有四个字节,但它们所包含的值的范围与使用常规“窄”字符串时所包含的值的范围相同。所以当你把你的西里尔字符用程序连接起来时,你就得到了一个长度为8的WStult,因为C++不理解UTF-8,但是你的终端确实是(因此它看起来像四个字符,但是C++中有8个)。
关于你的问题的一位评论者正确地指出了这个问题:-这是你真正需要的,一旦你意识到你根本没有处理宽字符串。

如果编码是utf-8,那么为什么要使用宽字符类型?@user207933 with
std::string
我得到这样的输出:
-48-65-48-80-48-65-48-80-48-48-80�пап�是的,我并没有暗示这是你的问题,只是一种困惑。你在网站上看到答案了吗?
echo -n "папа" | ./reverse
208 191 208 176 208 191 208 176
папа
�пап�