gpt4 book ai didi

当使用带有 _O_U8TEXT 的 setmode 来处理 unicode 时,C++ 崩溃

转载 作者:可可西里 更新时间:2023-11-01 14:16:47 34 4
gpt4 key购买 nike

我尝试打印 unicode 的是

_setmode(_fileno(stdout), _O_U8TEXT);
string str = u8"unicode 한글 hangul";
cout << str << endl;

我使用 setmode 来正确显示和获取 unicode,但它因 Debug Assertion Fail 而崩溃.

但是,

_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 工具(wprintfstd::wcout 等)时,这意味着使用 unicode (UTF-16) 字符串,输出将在写入文件时转换为 UTF-16 或 UTF-8。

试试这个:

_setmode(_fileno(stdout), _O_U8TEXT);
std::wcout << L"unicode 한글 hangul\n";

你不应该在控制台上看到差异,但如果你重定向输出:

> 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 €µöäüß

您可以在这里阅读更多相关信息:Conventional wisdom is retarded, aka What the @#%&* is _O_U16TEXT?

PS:断言告诉您的是,您不能将 unicode 输出与 ANSI 输出工具一起使用。奇怪的是,如果您不设置其中一种 unicode 模式,则不会强制执行...

关于当使用带有 _O_U8TEXT 的 setmode 来处理 unicode 时,C++ 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45232484/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com