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

c++ literal u8 and BOM (Byte Order Mask)

本文关键字:字节 顺序 掩码 BOM 文字 u8 c++      更新时间:2023-10-16

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

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

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

程序输出:

��то строка6

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

整个标准IO库都有这个代码页。下面是另一个测试程序(xe2x86x92是UTF-8中的箭头):

#include <stdio.h>
int main(void)
{
    char s[] = "xe2x86x92 a xe2x86x92 bn";
    int l = (int) sizeof(s) - 1;
    int wr = fwrite(s, 1, l, stdout);
    printf("%d/%d writtenn", wr, l);
    return 0;
}

及其输出:

��� a → b
10/12 written

注意,第一个字符再次被���替换(它在UTF-8中是3个字节),fwrite调用返回写在控制台上的字符的数量。这违反了C标准(它应该返回字节数),并且它会破坏每个正确使用fwrite或相关函数的程序(例如,尝试在Python 3.4中打印"☺☺☺☺☺☺☺☺☺☺☺☺")。

所以你唯一可靠地输出Unicode文本的选项是windows特定的(除非这些问题在最新版本的MSVC中得到修复):

  • 使用宽输出函数,如下所述:在Windows控制台应用程序

  • 中输出unicode字符串
  • 使用WriteConsoleW(宽版本)。请确保您测试了标准输出或错误句柄是否实际上是一个控制台。