我正在尝试实现一个应用程序,我希望用户在命令行上输入重音字符。我想要做的是将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
现在我的控制台有问题吗?
答案 0 :(得分:2)
mbstowcs
函数使用当前语言环境中的字符编码。您没有设置区域设置,因此使用默认的“C”区域设置;默认语言环境仅支持ASCII字符。此外,您应该检查mbstowcs
的返回值,以便在您不知情的情况下不会失败。
要解决此问题,请在程序中设置区域设置:
#include <clocale>
...
int main(int argc, const char* argv[]){
setlocale(LC_ALL,""); // Use locale from environment
....
}