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

Author: bugwz
Link: https://bugwz.com/2017/06/04/c-encoding-problem/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.