我很小的时候有过一个想法就是将后缀exe(可执行文件)的文件改为txt(文本文件)再打开会发生什么,这样做过的人都知道吧,打开后文件会乱码.那为什么这些文件打开后会乱码?既然乱码了为什么计算机依旧能够执行呢?
计算机中的数据都是以二进制存储的(例如1001) ,这些数据要转换成我们能看的东西,这个过程叫编码(ChatGPT这么说的,我印象中好像叫编码应该我记错了,但这不重要,如果不是专业去了解就记住这个过程好了),然后这个转换相当于翻译工作,把0和1组成得数据翻译成屏幕上的内容
如上图计算器↑
这里做一下声明
HEX表示十六进制。
DEC表示十进制。
OCT表示八进制。
BIN表示二进制。
在这张图(P1)中选择了DEC(十进制)并输入114514(相当于把十进制zhuan),八进制、二进制、还有十六进制都出来了,计算机就是这么将这些二进制数据转换的,但是我们在文本文档中输入一些中文内容,又是怎么被显示出来呢?
我们先抛开问题来讲另一个与之相关的知识。
相比很多人都知道这个东西吧,像KB,MB,GB等,这些是比较常用的存储单位,还有一些比如说B(字节Byte),b(位bit)(大写和小写的b不是同一个东西!!!)b的话就是最小单位,1b只能存储0或1,8个b又是一个B,虽然一个B很小的单位,但它能够存储很多东西,比如ASCII,一种计算机能够理解的语言,就是前面所说的翻译工作,在这个翻译工作中ASCII如同字典,下面展示了一些Byte代表的ASCII值:
00100000 代表空(没有任何东西)
00100001代表!
00100010代表"
00100011代表#
00100100代表$
00100101代表%
00100110代表&
00100111代表'
00101000代表(
00101001代表)
00101010代表*
00101011代表+
现在你们应该能够理解一些特殊的符号(上面的括号,加减符号等)怎样存储在计算机并显示在电脑屏幕上了。
把话拉回一些。
我们打开的txt文件(文本文件)并不是在计算机中就长这样,他们原本是一串0和1,只不过打开的过程中显示txt文件的程序将这串二进制文件转化成"人话"并且显示出来.
显示的文字也是这样,他们经过了一些转变,原来只是0和1后来转化成了文字,你们是否好奇0和1是如何转化成文字呢?
这要说到另一个东西了,它叫UTF-8,当然还有Unicode,跟上面ASCII的性质一样,也相当于字典,但是咱们中国人的汉字多得很,它们一个字节也就八个bit(打个比方:1字节可以这样表示00000000,每个0就是一个bit),这么点用来表示字母还行(毕竟英语就26个字母),但是汉字却不够,怎么办呢?一个字节不够就用两个,两个字节不用就用三个,但是能用少点就少点,毕竟每个字节都是空间,得达到节省空间得目的,就得少用点字节,现在表示以2-3字节每个字居多。比较多的是2个字节吧,举个简单的例子(.)左边括号是英文里的句号也就是点(。)而这个是中文的句号,它不仅是外形上的变化而且细心观察(你可以尝试把它选中)你会发现这个中文的句号要比英文的宽,就是因为中文所占的字节较多(如有错误评论区指正)
搞清楚这一点,乱码的原因就很好说了,可能很多人还是一脸懵,那我再稍微解释一下。
用两个字节来存储或三个字节存储一个汉字,但是两个或三个间的0和1能够不重复的组合很多甚至比汉字还多,有些组合还没有被定义,就比如advan是个不存在的单词,我们无法将它翻译。一个道理,计算机也是如此。这是导致乱码的一个原因。
还有个原因,exe文件是二进制文件,它是写给计算机看的而不是写给人看的,自然没有遵循UTF-8等的规矩。管它UTF-8会翻译成什么人话,它能执行而不是既能执行又能看得懂,有些跌跌撞撞勉强能被翻译的硬是被这个解码的翻译成鬼话(大概长这样了PK Q��V�^�П info.jsonm���0���Pr������;���)Yk$�l���& �=~3�3���8b�EY���Uz1y�aI�:�oX� |���z��=����Y8�#6����K�K)�4������ّf���g���xf��[��ٵ�*�M�߄J����H��PK۽�V����r2)其实内容还是勉强能看一点的比如说xxx.jsonm只不过大部分被打上了问号.
顺便说下:我们复制文字等也是这样,他复制到的不是你看到的而是一串二进制数据,所以从一个地方复制到另一个地方可能也会乱码,举个🌰:假设台湾人给你发东西,但是他们那边用的是big-5(也相当于是字典,但是里面内容不相同),文件到你这边,你用的依旧是原来的方式解码,软件也不知道这是用big-5的解码方式没有改变。那你打开就乱码了。
文章可能会有些小错误,毕竟第一次写文章,希望各位能够理解谢谢😁
大象AI写作 2024-12-21