我决定写一个简单的例子:
#include <iostream>
int main()
{
std::cout << u8"это строка6" << std::endl;
return 0;
}
在控制台中执行以下命令: chcp 65001
程序输出:
��то строка6
为什么第一个字符显示不正确?我认为代码页65001使用BOM,并将第一个符号读作BOM。这是真的吗?
答案 0 :(得分:2)
整个标准IO库与该代码页狡猾。这是另一个测试程序(\xe2\x86\x92
是UTF-8中的箭头→
):
#include <stdio.h>
int main(void)
{
char s[] = "\xe2\x86\x92 a \xe2\x86\x92 b\n";
int l = (int) sizeof(s) - 1;
int wr = fwrite(s, 1, l, stdout);
printf("%d/%d written\n", wr, l);
return 0;
}
及其输出:
��� a → b
10/12 written
请注意,第一个字符再次被���
(UTF-8中的3个字节)替换,fwrite
调用返回写入的字符数控制台。这违反了C标准(它应该返回 bytes 的数量),它将正确地使用fwrite或相关函数中断每个程序(例如,尝试打印"☺☺☺☺☺☺☺☺☺☺☺☺"
Python 3.4)。
因此,您可靠地输出Unicode文本的唯一选择是特定于Windows的(除非在最新版本的MSVC中修复了这些问题):
使用宽输出功能,如下所述:Output unicode strings in Windows console app
使用WriteConsoleW
(宽版)。确保测试标准输出或错误句柄是否实际上是控制台。