c ++文字u8和BOM(字节顺序掩码)

时间:2015-07-07 08:08:04

标签: c++ unicode string-literals codepages

我决定写一个简单的例子:

#include <iostream>

int main()
{
    std::cout << u8"это строка6" << std::endl;
    return 0;
}

在控制台中执行以下命令: chcp 65001

程序输出:

��то строка6

为什么第一个字符显示不正确?我认为代码页65001使用BOM,并将第一个符号读作BOM。这是真的吗?

1 个答案:

答案 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中修复了这些问题):