乱码是怎么来的?

作者: 猪了个去

来源: 果壳

发布日期: 2015-04-02

文章讲述了初学者在学习C语言时遇到乱码“烫烫烫”和“锟斤拷”的经历,解释了这些乱码在Visual Studio Debug模式下的产生原因,包括内存初始化值0xCC在MBCS字符集中的对应字符“烫”,以及Unicode转换问题导致的“锟斤拷”。

大一刚学C语言,第二次上机课,当我发现我照着书抄写的程序在运行之后的黑框里跳出一排烫烫烫烫烫,当时就震惊了。你们能想象一个来自小城,在大学之前没怎么接触过电脑更不懂代码的孩子当时内心的恐惧吗?我真的以为这是电脑过热发出的警告,于是我弯下腰把插头拔了。——From. chengr28

问题:照着书抄写的程序,在运行之后的黑框里跳出的一排“烫烫烫烫烫”字样是什么?

@猪了个去 回答:

手持两把锟斤拷,口中疾呼烫烫烫

在Visual Studio中的Debug模式下,如果声明一个变量,但是没有初始化,微软会给未初始化的内存复制为0xCC。给为初始化的内存赋0xCC是有原因的,0xCC其实是INT3中断指令,所以如果在Debug模式下试图去执行这块未初始化的内存的话就会中断程序。

但VS中调试器默认的字符集是MBCS,而在MBCS中0xCCCC正好就是中文中的“烫”,所以显示出来就都是烫……

如果是用分配堆的内存,会初始化成0xCD,0xCDCD在MBCS字符集中就是屯……

锟斤拷则涉及unicode的字符集转换问题,Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLACEMENT CHARACTER。

U+FFFD的UTF-8编码是0xEFBFBD,如果重复多次形成:EFBFBDEFBFBDEFBFBD 这样在GBK/CP936/GB2312/GB18030的环境(都是中国标准惹的祸)中显示的话,一个汉字2个字节,最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)……

UUID: 3b04a8b4-9619-458c-9e0a-3a1e1bb31b68

原始文件名: /home/andie/dev/tudou/annot/AI语料库-20240917-V2/AI语料库/果壳公众号-pdf2txt/2015/2015-04-02_手持两把锟斤拷,口中疾呼烫烫烫:乱码是怎么来的?.txt

是否为广告: 否

处理费用: 0.0023 元