C语言中有趣的烫烫烫

在学校使用 Windows 下的 Visual Studio 2017 进行课堂C的学习过程中遇到过很多类似于 烫烫烫烫烫烫 , 锟斤拷,屯屯屯 等比较有意思的乱码,也闹出了一些比较有意思的事情。

一、现象

以下是部分乱码在不同的编码类型下的编码值:

字符 简体中文(GB2312) Unicode Unicode (UTF-8)
CCCC EB70 E783AB
EFBF 1F95 E9949F
BDEF A465 E696A4
BFBD F762 E68BB7
CDCD 6F5C E5B1AF
EFBB 1895 E99498
C9B5 BB50 E582BB

二、分析

以上比较有意思的乱码情况仅出现在使用Visual Studio或者VC6.0自带的MSVC编译器进行编译时才会出现,也就是说通常只有在Windows环境下使用Visual Studio或者VC6.0进行代码开发,并且处于Debug的运行模式才会出现。

2.1、烫(0xCCCC)

MSVC编译器会将未被初始化的栈内存使用0XCC进行填充,导致我们在使用为初始化的栈内存时便会出现烫烫烫的错误提示;

烫(0xCCCC)

2.2、屯(0xCDCD)

MSVC编译器会将未被初始化的堆内存使用0XCD进行填充,导致我们在使用为初始化的栈内存时便会出现屯屯屯的错误提示;

屯(0xCDCD)

2.3、锟斤拷

锟斤拷涉及Unicode字符集转换问题,在编码转化你的过程中,当Unicode无法表示一个字符的时候,它会用一个占位符(U+FFFD REPLACEMENT CHARACTER)来表示这些文字。U+FFFD的UTF-8编码是0xEFBFBD,如果重复多次形成锟斤拷的盛状。

锟斤拷

2.4、锘

微软在 UTF-8 文件头部加上了 EF BB BF BOM 标志。在不支持 BOM 的环境下对其停止 UTF-8 解码失掉字,

BOMByte Order Mark 的缩写。是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。

锘

参考地址:https://zhuanlan.zhihu.com/p/27253604

作者: bugwz
链接: https://bugwz.com/2017/06/04/c-encoding-problem/
声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 咕咕