2016-04-30 79 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? - 這真的是你所需要的,一旦你意識到你根本不處理寬字符串。