在C++中反转wstring

Reverse wstring in C++

本文关键字:wstring C++      更新时间:2023-10-16

我需要反转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字节的cyrillic文本时,我会得到这样的输出:

echo -n "папа" | ./reverse
208 191 208 176 208 191 208 176
папа
�пап�

如何正确地反转字符串?

附言:我使用的是OS X.

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

您可以看到,当您在OSX上用wstring调用getline()时,它根本不会读取宽字符。实际上,每个字符有四个字节,但它们的值范围与使用常规"窄"字符串时的值范围相同,为0-255。因此,当你将西里尔字母管道传输到你的程序时,你会得到一个长度为8的wstring,因为C++不理解UTF-8,但你的终端可以理解(因此,它在终端中看起来像四个字符,而在C++中是8个)。

一位评论你问题的人正确地指出了这个问题:我如何在适当的位置反转UTF-8字符串?-一旦你意识到你根本不需要处理宽字符串,这就是你真正需要的。