2016-04-30 112 views
3

我需要反转wstring。我有这样的代码:C++中的反向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

如果编码是utf-8,那么为什么要使用宽字符类型? – user2079303

+0

@ user2079303使用'std :: string'我得到这样的输出:'-48 -65 -48 -80 -48 -65 -48 -80 папа пап ' – 0x1337

+0

是的,我并不是暗示那是你的问题,只是一个混乱。 – user2079303

回答

1

您的系统OS X使用UTF-8。所以没有理由使用wstringwchar_t。事实上,这是混乱来自的地方!

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

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