2013-07-09 58 views
3

我想實現一個應用程序,我希望用戶在命令行上輸入重音字符。我想要做的是將char數組轉換成wstring的向量。如何將重音字符從命令行轉換爲wstring?

我在Linux上。

這是我走到這一步:

#include <vector> 
#include <string> 
#include <cstring> 
#include <iostream> 

std::vector<std::wstring> parse_args(int argc, const char* argv[]){ 
    std::vector<std::wstring> args; 

    for(int i = 0; i < argc - 1; ++i){ 
     auto raw = argv[i+1]; 

     wchar_t* buf = new wchar_t[1025]; 
     auto size = mbstowcs(buf, raw, 1024); 

     args.push_back(std::wstring(buf, size)); 
     delete[] buf; 
    } 

    return std::move(args); 
} 

int main(int argc, const char* argv[]){ 
    auto args = parse_args(argc, argv); 

    for(auto& arg : args){ 
     std::wcout << arg << std::endl; 
    } 
} 

它的工作原理與普通字符預期,但重音字符不一樣。舉例來說,如果我做的:

./a.out Ménage 

崩潰:

terminate called after throwing an instance of 'std::length_error' 
    what(): basic_string::_S_create 
[1] 30564 abort  ./a.out Ménage 

唯一的例外來自wstring的的構造,因爲大小= 18446744073709551615(爲size_t - 1,我認爲),這似乎表明,有意想不到的角色。

我不明白它出了什麼問題?

我在做什麼錯了?

編輯:這將更好地

如果我添加

setlocale(LC_ALL, ""); 

在節目的開始,它不會崩潰,但會輸出一個奇怪的字符:

M�nage 

現在可以成爲我的控制檯的問題嗎?

+0

你的窗口? –

+2

@PreetKukreti:Windows很少有名爲'a.out'的可執行文件。 – MSalters

+0

這可能證明有幫助:http://stackoverflow.com/questions/6400597/why-does-mbstowcs-return-invalid-multibyte-character – hmjd

回答

2

mbstowcs函數使用當前語言環境中的字符編碼。您不設置區域設置,因此使用默認的「C」語言環境;默認語言環境僅支持ASCII字符。此外,你應該檢查返回值mbstowcs,所以它不會失敗,你不知道它。

要解決這個問題,設置區域設置在程序:

#include <clocale> 

... 

int main(int argc, const char* argv[]){ 
    setlocale(LC_ALL,""); // Use locale from environment 
    .... 
} 
+1

或者在C++中,'std :: locale :: global(std :: locale())'。 – 0x499602D2

+0

我剛纔試過這個。它好一點。它不會崩潰,但它確實輸出M nage而不是Ménage。 –

+0

您是否正在使用UTF-8語言環境和支持UTF-8的終端運行?運行'locale'來檢查你當前的語言環境。 – Joni