听说你的程序又双叒叕乱码了

来源:Python 技术「ID: pythonall」

在我刚开始接触编程的时候,时不时就会遇到程序乱码问题。亦或是控制台输出乱码,亦或是数据库乱码,亦或是网页端显示乱码,总之乱码无处不在,它总是会在不应该出现的时间点出现在在不应该出现的位置。

那么乱码究竟是怎么回事呢,为啥好端端的文字就变成一堆乱七八糟的符号了呢?

这时如果你去网上搜索乱码问题,你就会发现大量的文章向你扑面而来,看完之后你更加郁闷了,还是不明其中缘由,今天我们就来探究下程序究竟为什么会乱码?

ASCII 码

大家都知道计算机是从美国开始走向全世界的,最初的用途是服务于美国军方,用来帮助人类做一些复杂的数学运算,比如计算导弹弹道之类的。

后来随着计算机的发展,人们发现这个工具简直太好用了,事实再一次证明人类是多么的贪婪。他们有了更多的需求和欲望,比如想让计算机处理文字,控制打印机等。这时候就不像处理数学运算那么简单了,因为计算机内部都是 0 和 1 的二进制代码,怎么才能让计算机显示文字呢,于是发明计算机的大叔们搞了一个字符和数字的对应关系。我们知道虽然单词有很多个,但每个单词都是由 26 个字母组成的,区分大小写的话也才 52 个,1 个字节 8 位可以有 256 种状态,再加上数字和一些标点符号 1 个字节也足够了。

于是那些大叔们把从 0 开始的 32 种状态规定了特殊的用途,比如打印机换行,彩色打印。然后又把数字、标点符号、大小写字母等逐一编码,直到编写到 127 号,也就是共计 128 个编码。最后给这张编码表起了个逼格很高的名字,叫「ASCII 码」,也叫「美国信息交换标准代码」(American Standard Code for Information Interchange)。

比如,小写字母 a 对应的 ASCII 码值是 97,十六进制 0x61;数字 0 对应的 ASCII 码是 48,十六进制 0x30。「ASCII 码」是计算机编码的基石。后面所有的编码都是在此基础上完善的。

GBK 编码

后来随着时代的不断发展,计算机在全球范围内开始普及。日本,俄罗斯,中国等很多国家都开始使用计算机,但其他很多国家用的并不是英文呀,比如我们中国的汉字,跟英文的字母简直是天壤之别,而且仅常用的汉字就要有 3000+ 了,1 个字节 256 种状态怎么够用呢。

于是聪慧的中国人民发明了我们自己的编码系统,用两个字节来表示一个汉字或者字符。第一个字节称为「高位字节」(也称区字节),第二个字节称为「低位字节」(也称位字节)。但这两个字节是有限制的,「高位字节」使用范围为 0xA1-0xF7,「低位字节」使用范围为 0xA1-0xFE

这样我们就可以组合出大概 8000 个左右的汉字了,对于日常使用来说是足够了。这套编码规则就是「GB2312」。

你知道的,中国文化博大精深,区区 8000 个汉字怎么够用,很多少数民族也迫切希望用上计算机,很多人名依然无法识别,于是不在对高位字节和低位字节做限制,只要发现第一个字节大于 127 就认为这是一个汉字的开始,为什么要大于 127 呢,因为要兼容「ASCII 码」呀,127 以内说明是该字节表示的是「ASCII 码」。

这样子 2 个字节 15 位大概可以表示 65536 - 127 个汉字。

然而香港和台湾并没有使用大陆的 GBK 编码规则,因为他们使用繁体字,所以就单独设计了一套自己的编码系统,叫做「Big5」表,也叫大五码或者五大码。

然后日本、韩国等不同国家也都设计了自己独有的编码规则,因为是各自独立设计,所以大概率不会出现一个字符在不同的编码系统中对应同一个数字。于是就会出出现乱码这种很诡异的现象。

比如,你的韩国女朋友给你发了一封电子邮件,里面的真实内容为「么么哒」,由于电子邮件是在韩国写的,所以计算机肯定是使用韩国的编码系统,假设这三个字对应的编码分别是 0xA6B2、0xA6B2、0xC132;当你收到邮件之后,因为你是在国内所以肯定是使用 GBK 编码来解码,那么将三个编码转换为汉字之后发现是「分手吧」。

相信此时的你肯定是一脸懵逼,然后就又开始怀疑是不是自己做错了什么。

天下大统

为了解决各国编码不统一的问题,国际标准化组织制定了一套新的规则,叫做「Unicode码」,这套编码规则就厉害了,可以将全人类所有的字符都包含进去,包括人类走出非洲时的所使用的象形文字都可以包含进来。

那么如果要想包含这么多的字符进来的话,至少需要三个字节才可以,三个字节可以存储三百多万个字符,这应该可以覆盖所有文化的字符了吧,如果还不够的话,就用四个字节来表示一个字符,这样可以组合出大概 21 亿个字符,可能用到地球毁灭那一天都用不完。

可是随之而来的是另外一个问题,由于欧美大多使用英文,一个字节足以表示,现在让他们用三个字节,就造成了空间的巨大浪费。浪费率高达 2/3,做过网络编程的小伙伴们都知道,在网络中数据的传输是需要很大的成本的,而且还不可靠,字节数越多,浪费的资源也就越多。

于是,在接下来的时间内,出现了多种「Unicode码」的具体编码方式,分别是 UTF-8、UTF-16、UTF-32,其中 UTF-8 占用一到四个字节,UTF-16 占用二到四个字节,UTF-32 占用四个字节。显然  UTF-8 的设计更合理,欧美字符用一个字节来存储,中文或者其他字符用二个或者三个字节来存储,岂不美哉。

自此,天下大统。呃,不,是计算机编码得以大统,世上再无乱码。

总结

今天我们详细介绍了编码的历史,以及乱码的缘由,下次遇到乱码问题再也不慌了。

(0)

相关推荐

  • 【Python面试】 说说4种常用编码的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • 女朋友问我:为什么会乱码?

    前言 乱码这个东西相信大家都遇到过,今天我的女朋友三歪就火急火燎的上来找我:"亲爱的,我的idea怎么输出乱码了?" 我一顿操作就给他搞好了,但是三歪不愧是我的女朋友,好奇心跟我是 ...

  • 为啥妹子给我发的 Excel 打开之后是乱码?

    咳咳 人生的三大错觉之一 就是她喜欢我 为了解开粉丝的疑惑 让他面对现实 今天我就来给大家揭秘 乱码背后那些不为人知的事 首先 我们要意识到 『乱码』 本质上是编码与解码的方式不一致 举个例子 当用拼 ...

  • 你会用手机投屏到电脑吗?听说只有1%的人知道#程序员 #电脑知识 #抖音小助手

    你会用手机投屏到电脑吗?听说只有1%的人知道#程序员 #电脑知识 #抖音小助手

  • 听说,HTC又双叒叕要卖手机业务了?

    本来在这周之前,HTC的日子似乎是越过越好,因为各方消息都表示,HTC U11上市之后的销量非常优秀,远超前几代的旗舰.但是这一周以内却又连续爆出了好几个关于HTC的不利消息,首先就是2017年Q2依 ...

  • 《乱码射杀》:说好的一起装逼,都让程序自己装了?|酷玩东西

    代码敲累了,不妨做个游戏吧. 对于任何一款游戏,代码都是最基础.最底层的一部分,它的性质决定了只能扮演着幕后者的角色,一般很少能有与玩家直接接触的机会. 但就是有这样一个开发团队,将代码页面(准确地说 ...

  • 程序员必备的思维能力:结构化思维

    在日常工作中,我们时常会碰到这样的情况,有的人讲一件事情的时候逻辑非常混乱,说了很多事情的罗列,却说不到重点.有的人写代码,本身的业务逻辑并没有多复杂,但呈现出的代码却像一堆线团,混乱不堪,无法理解. ...

  • 听说了吗?中医治疗肿瘤也很牛

    大多数的患者发现肿瘤后 切瘤心切 第一时间想到的 可能是手术或放化疗等方法 一般到了中晚期 才会想到中医 抱着试试看的心态 走进中医门诊寻求帮助 其实这对中医药治疗肿瘤 是一种误解 在肿瘤治疗当中 中 ...

  • 听说,这四种人尤其适合葡萄牙购房移民,里面有你吗?

    在葡萄牙购置房产,就能申请葡萄牙购房移民项目.这个项目听说尤其适合四类人申请! 但该项目变政在即,今年年初,葡萄牙政府对"黄金签证项目"进行修订.该修正案确定了从2022年开始,最 ...

  • 网付课堂:开发一套智慧经营小程序究竟需要多少钱?

    小程序我们大家都不算陌生. 很早之前,小程序因为不像app一样需要下载,是一款无需安装.下载,随开随用的软件,不占用手机内存,所以它的出现曾经一度很受商家与消费者的青睐. 而通过这几年的发展,小程序的 ...

  • 听说同一个天下同一个妈?看看你妈妈中了几招?

    听说同一个天下同一个妈?看看你妈妈中了几招? 每个人在说起母亲的时候都是不一样的感觉, 但有时候妈妈的举动却会让人觉得同一个天下同一个妈. 妈妈这些举动是究竟怎么做到全国统一的? 大家都来看一看,这些 ...

  • 违建房屋只有经过下列程序才能拆除,没有的就是赤裸裸的违法

    作为拆迁户的你有没有听到拆迁方说你的房屋是违建没有补偿,如果按照拆迁方的要求配合还能有一些补偿不然没有补偿,很多拆迁户还在迷糊中房屋就成了违建,其实有很多房屋只是被拆迁方以违建的名义拆掉实际中并非是违 ...