C++ std::不能在Windows上使用UTF-8吗?
我想让C++ std::不能在Windows上使用UTF-8吗?,c++,visual-c++,unicode,encoding,utf-8,C++,Visual C++,Unicode,Encoding,Utf 8,我想让std::cout打印一个UTF-8文本。对于gcc来说,这似乎是一项简单的任务,但是对于Windows来说,这是一项极其困难的任务 我正在尝试的代码是: std::cout << "Ελληνικά Русский 你好"; 下面是我要做的: 确保源文件是utf-8编码的,并且内容正确(在另一个编辑器中打开它们,检查标志符号和文件编码) 从公式中删除控制台——将输出重定向到文件,并使用utf-8感知编辑器检查其内容(与源代码相同) 将/utf-8 cmdline选项与MSV
std::cout
打印一个UTF-8文本。对于gcc来说,这似乎是一项简单的任务,但是对于Windows来说,这是一项极其困难的任务
我正在尝试的代码是:
std::cout << "Ελληνικά Русский 你好";
下面是我要做的:
setvbuf(stderr, NULL, _IOFBF, 1024); // on Windows 10+ we need buffering or console will get 1 byte at a time (screwing up utf-8 encoding)
setvbuf(stdout, NULL, _IOFBF, 1024);
不幸的是,这也意味着,如果在下一次刷新之前完全填充缓冲区,仍然有可能导致输出错误。正确的解决方案——在发送到输出的每个字符串之后(假设每个字符串小于1024),手动刷新它(
endl
或fflush()
)。如果MS支持行缓冲…您是否尝试使用wcout
<代码>标准::wcout@AlgirdasPreidžius我知道它会起作用。我的目标是避免修改这一行代码,因为这一行代码在Linux上工作得非常好。您能更具体地说明哪些代码不工作吗?发生了什么?在Windows/MSVCRT上,std::cout
无法支持Unicode,句号。(您可以接近代码页65001,但控制台中有无法克服的错误会破坏它,Microsoft已经永远忽略了它们,所以不要期望它们得到修复。)std::wcout
可以通过使用\u setmode
和\u UTF8
使其大部分工作,但仍然存在问题(这都是为了解决这个问题)并且你不能在之后使用与cout相关的接口,否则它会爆炸。你通常最好是(a)读取/发送UTF-8字符到控制台,而不管Windows用户是否看到mojibake,或者(b)仅使用您自己的输入/输出函数,在Windows上的Win32 WriteConsoleW等接口和其他平台上的标准库之间进行切换,在其他平台上,该接口的破坏程度较轻。但您(1)通过MSVCRT在控制台上显示正确的输出,以及(2)使用未更改的std::cout
调用的要求是不可调和的。
setvbuf(stderr, NULL, _IOFBF, 1024); // on Windows 10+ we need buffering or console will get 1 byte at a time (screwing up utf-8 encoding)
setvbuf(stdout, NULL, _IOFBF, 1024);