2016-04-30 9 views
3

wstringを逆にする必要があります。私は以上の1つのバイトをコード化しているキリル文字のテキストを入力するとき、私は、C++の逆wstring

echo -n "papa" | ./reverse 
112 97 112 97 
papa 
apap 

しかし:

#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 "папа" | ./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

お使いのシステムでは、UTF-8を使用しています。したがって、wstringまたはwchar_tを使用する理由はありません。そして確かにこれは混乱がどこから来るのかです!

getline()をOS Xのwstringと呼ぶと、ワイド文字はまったく読み込まれません。文字は実際にはそれぞれ4バイトですが、通常の「狭い」文字列を使用した場合と同じ0〜255の範囲の値を保持します。だからあなたのプログラムにあなたのキリル文字をパイプすると、C++はUTF-8を理解していないので、あなたの端末はそれゆえ(したがって、端末では4文字のように見えますが、C++では8文字に見えるので、wstringの長さは8になります) 。

あなたの質問のコメント者は、この質問を指摘するのは当然でした:How do I reverse a UTF-8 string in place? - あなたがワイド​​ストリングをまったく扱っていないことを理解すれば、これは本当に必要なものです。