c++文字u8和BOM(字节顺序掩码)
c++ literal u8 and BOM (Byte Order Mask)
我决定写一个简单的例子:
#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
(宽版本)。请确保您测试了标准输出或错误句柄是否实际上是一个控制台。
相关文章:
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- C++ int* 和 char* 字节顺序已交换
- 交换未定义数据类型中的字节顺序
- winsock上的蓝牙,如何删除字节顺序标记
- 将网络字节顺序(大字节序)转换为小字节序
- 将主机字节顺序转换为网络字节顺序有时会导致奇怪的结果
- 当在网络字节顺序中放置双精度时,为什么它是在 4 字节块中完成的
- 使用mysql本机函数进行字节顺序转换
- C++:如何交换wchar_t的字节顺序
- reinterpret_cast接收端的'serializing'数据、字节顺序和对齐方式
- 到Arduino的串行通信的字节顺序
- 使用不带Unicode字节顺序标记的iconv进行字符转换
- 从Byte*到unsigned int的memcpy正在反转字节顺序
- 忽略C++中的字节顺序标记,从流中读取
- iPhone TCP-IP字节顺序映射
- 特定字节顺序的内存c/c++
- 按字节顺序读取UTF-16格式的文件到wstring
- 使用预处理器检查字节顺序
- 确定uint32_t的字节顺序
- 什么可能导致数据包的字节顺序部分混乱?