如何将重音字符从命令行转换为wstring
How to convert accented chars from command line to 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, "");
在程序开始时,它没有崩溃,但确实输出了一个奇怪的字符:
M�nage
现在我的控制台会有问题吗?
mbstowcs
函数使用当前语言环境中的字符编码。您没有设置区域设置,因此使用默认的"C"区域设置;默认区域设置仅支持ASCII字符。此外,你应该检查mbstowcs
的返回值,这样它就不会在你不知道的情况下失败
要解决此问题,请在程序中设置区域设置:
#include <clocale>
...
int main(int argc, const char* argv[]){
setlocale(LC_ALL,""); // Use locale from environment
....
}
相关文章:
- 从命令行c++发送文本文件名
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 数组长度,为什么从命令行获取时不能使用它?
- 将命令行转换为从 Openssl 到 c++ 的代码
- 链接从命令行转换为Make的库
- 将编译器命令行转换为 CMakeLists.txt用于 Casablanca Rest SDK
- 将命令行参数转换为qimage
- 将FFMPEG命令行转换为C 编解码器设置
- 来自Magick++的形态,以匹配命令行转换
- C ++如何将我的命令行参数(MAC地址)转换为无符号字符
- 将命令行参数程序转换为菜单驱动程序
- 保存命令行参数并对其进行类型转换
- 将命令行参数解析/转换为不同类型
- 如何将重音字符从命令行转换为wstring
- 如何在c++中将命令行字符串转换为hwnd
- 从命令行调用时转换无效(c++)
- 在xcode中将命令行工具转换为.app
- Gstreamer语言 - 转换命令行gst-launch到C代码
- 将命令行参数转换为字符串