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

How to convert accented chars from command line to wstring?

本文关键字:命令行 转换 wstring 字符      更新时间:2023-10-16

我正在尝试实现一个应用程序,希望用户在命令行中输入重音字符。我想做的是将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, "");

在程序开始时,它没有崩溃,但确实输出了一个奇怪的字符:

M�nage

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

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

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

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