在学校使用 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
进行填充,导致我们在使用为初始化的栈内存时便会出现烫烫烫
的错误提示;
2.2、屯(0xCDCD)
MSVC编译器会将未被初始化的堆内存使用0XCD
进行填充,导致我们在使用为初始化的栈内存时便会出现屯屯屯
的错误提示;
2.3、锟斤拷
锟斤拷涉及Unicode
字符集转换问题,在编码转化你的过程中,当Unicode无法表示一个字符的时候,它会用一个占位符(U+FFFD REPLACEMENT CHARACTER)来表示这些文字。U+FFFD的UTF-8编码是0xEFBFBD
,如果重复多次形成锟斤拷的盛状。
2.4、锘
微软在 UTF-8
文件头部加上了 EF BB BF BOM
标志。在不支持 BOM 的环境下对其停止 UTF-8 解码失掉锘字,
BOM
是 Byte Order Mark
的缩写。是UTF编码方案里用于标识编码的标准标记,在UTF-16
里本来是FF FE
,变成UTF-8
就成了EF BB BF
。这个标记是可选的,因为UTF8
字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8
编码的。