_setmode https://learn.microsoft.com/en-gb/cpp/c-runtime-library/reference/setmode提及_O_U8TEXT
and _O_U16TEXT
(最后),但没有详细说明他们做了什么。它确实指出这些是翻译模式.
的文档_wsopen https://learn.microsoft.com/en-gb/cpp/c-runtime-library/reference/sopen-wsopen列表(强调我的):
_O_U16TEXT
打开一个file在 Unicode UTF-16 模式下。
_O_U8TEXT
打开一个file在 Unicode UTF-8 模式下。
这意味着:当使用 unicode io 设施时(wprintf
, std::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
从理论上讲,这应该意味着您也可以使用_O_U8TEXT
on stdin
读取 UTF-8 输入,但实际上并不总是有效:
> u8in < u8.txt
unicode 한글 hangul €µöäüß
> u8in
unicode 한글 hangul €µöäüß
unicode ?? hangul ?攄��
_O_U16TEXT
appears使用控制台输入(在我的机器上),但是您不能使用 UTF-8 编码的重定向输入/输出:
> u16in
unicode 한글 hangul €µöäüß
unicode 한글 hangul €µöäüß
您可以在这里阅读更多相关内容:
PS:这个断言告诉你的是,你can't将 unicode 输出与 ANSI 输出工具结合使用。奇怪的是,如果您不设置其中一种 unicode 模式,则不会强制执行此操作...