C++ 将 setmode 与 _O_U8TEXT 一起使用来处理 unicode 时崩溃
C++ crash when use setmode with _O_U8TEXT to deal with unicode
我尝试打印 unicode 的是
_setmode(_fileno(stdout), _O_U8TEXT);
string str = u8"unicode 한글 hangul";
cout << str << endl;
我使用 setmode 来正确显示和获取 unicode,但它因调试断言失败而崩溃。
然而
_setmode(_fileno(stdout), _O_U16TEXT);
wstring str = L"unicode 한글 hangul";
wcout << str << endl;
_O_U16TEXT正确编译和打印。
我应该怎么做才能使用 UTF-8?我必须找到另一个技巧吗?
_setmode提到了_O_U8TEXT
和_O_U16TEXT
(最后(,但没有详细说明它们的作用。它确实指出这些是翻译模式。
_wsopen列表的文档(强调我的(:
_O_U16TEXT
以 Unicode UTF-16 模式打开文件。_O_U8TEXT
以 Unicode UTF-8 模式打开文件。
这意味着:当使用 unicode io 工具(wprintf
、std::wcout
等(时,这意味着使用 unicode (UTF-16( 字符串,输出将在写入文件时转换为 UTF-16 或 UTF-8。
试试这个:
_setmode(_fileno(stdout), _O_U8TEXT);
std::wcout << L"unicode 한글 hanguln";
您应该不会在控制台上看到差异,但如果重定向输出:
> u8out | hexdump -C
00000000 75 6e 69 63 6f 64 65 20 ed 95 9c ea b8 80 20 68 |unicode ...... h|
00000010 61 6e 67 75 6c 0d 0a |angul..|
00000017
> u16out | hexdump -C
00000000 75 00 6e 00 69 00 63 00 6f 00 64 00 65 00 20 00 |u.n.i.c.o.d.e. .|
00000010 5c d5 00 ae 20 00 68 00 61 00 6e 00 67 00 75 00 |... .h.a.n.g.u.|
00000020 6c 00 0d 00 0a 00 |l.....|
00000026
从理论上讲,这应该意味着您也可以在stdin
上使用_O_U8TEXT
来读取 UTF-8 输入,但实际上这并不总是有效:
> u8in < u8.txt
unicode 한글 hangul €µöäüß
> u8in
unicode 한글 hangul €µöäüß
unicode ?? hangul ?攄��
_O_U16TEXT
似乎可以使用控制台输入(在我的机器上(,但您不能使用 UTF-8 编码的重定向输入/输出:
> u16in
unicode 한글 hangul €µöäüß
unicode 한글 hangul €µöäüß
你可以在这里阅读更多关于这一点的信息:传统智慧是迟钝的,也就是@#%&*是什么_O_U16TEXT?
PS:断言告诉您的是,您不能将 unicode 输出与 ANSI 输出工具一起使用。奇怪的是,如果您不设置其中一种 unicode 模式,这不会强制执行,但是......
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- ascii 和 unicode 在处理级别有什么区别吗?
- 用wchar_t处理 unicode 字符好吗?它不会引起任何问题吗?
- 在2018年使用C++处理Unicode的正确方法是什么?
- C++ 将 setmode 与 _O_U8TEXT 一起使用来处理 unicode 时崩溃
- 使用C 17处理Unicode的有效,符合标准的机制是什么
- 如何处理C 中Unicode支持涉及的代码重复
- 如何处理JSON字符串中的unicode值
- C++中的Unicode字符串处理
- 显式使用Unicode/ANSI Windows API和让它们由别名处理之间的区别
- 如何使用Unicode处理PCRE
- 如何在Visual Studio中处理Unicode和非Unicode项目的混合
- c++和g++如何处理unicode
- 在C++中处理 Unicode 字符
- visual如何在C++中处理Unicode字符
- 使用Windows API处理Unicode字符串
- 如何审核我的Windows应用程序以获得正确的Unicode处理