文本文件、二进制文件和乱码

本文最后更新于:2023年4月1日 下午

文本文件和二进制文件的区别

你是否遇到过这种情景:当你编译完一个c文件之后,你发现有个地方仍需进行小修改,于是你使用vim重新打开.c源文件,但是不幸的是,你一不小心忘记在文件名上加上.c。于是结果你用vim打开了刚刚编译好的二进制文件,当然里面都是一堆你完全看不懂的乱码,但是你很好奇,为什么它是乱码,它不应该是充满了0和1么?

回答这个问题之前,首先来想一下另一个问题:

How does text editor work?

本质上来说,不管是vim也好,emacs也罢,甚至是Windows上的记事本,他们都是文本编辑器。而文本编辑器最大的特点就是能显示和编辑字符

回头来看一下我们的.c源文件,仔细想一下,本来源文件中的内容应该就是字符对应的ascii码(假如你的编辑器支持unicode的话,就是对应的unicode码),也就是说我们看到的内容是“文本编辑器想让我们看到的”,技术原理上来说就是vim将字符码转码变成了我们看到的内容。所以文件的真实内容其实是(计算机视角):

0x69 0x6e 0x74 0x20 0x6e 0x3b ...
# 上面这段转码之后变成int n;
# 实际上没有0x这个符号也没有空格,但是为了可读性在此加上

那么前面的问题就简单了。既然文本编辑器是无情的转码工具,那么使用vim打开的二进制文件内容就是将01转化为了相应的ascii/utf-8,而在二进制中最常出现的字符^@的utf-8编码就是000。

乱码

所以归根到底,很多乱码问题实际上都是由于对内容进行了错误的转码。比如在Windows早期(Windows 7以前),记事本的编码格式默认是gbk,所以如果是utf-8书写的内容,用记事本打开一定会乱码,这个时候就千万不能保存,否则就是将乱码内容进行错误的编码再写入,相当于原本内容直接变成垃圾信息。

这里推荐去看一下这个科普视频,可以加深理解


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!