如何将重音字符从命令行转换为wstring?

时间:2013-07-09 07:45:25

标签: c++ c++11 utf-8 wstring

我正在尝试实现一个应用程序,我希望用户在命令行上输入重音字符。我想要做的是将char数组转换为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的构造函数,因为size = 18446744073709551615(size_t - 1我认为),这似乎表明存在意外的字符。

我不知道它出了什么问题?

我做错了什么?

编辑:它会变得更好

如果我添加

setlocale(LC_ALL, "");

在程序开始时,它不会崩溃,但会输出一个奇怪的char:

M�nage

现在我的控制台有问题吗?

1 个答案:

答案 0 :(得分:2)

mbstowcs函数使用当前语言环境中的字符编码。您没有设置区域设置,因此使用默认的“C”区域设置;默认语言环境仅支持ASCII字符。此外,您应该检查mbstowcs的返回值,以便在您不知情的情况下不会失败。

要解决此问题,请在程序中设置区域设置:

#include <clocale>

...

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