文 | 豆豆

来源: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 的设计更合理,欧美字符用一个字节来存储,中文或者其他字符用二个或者三个字节来存储,岂不美哉。

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

总结

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

PS:公号内回复「Python」即可进入Python 新手学习交流群,一起100天计划!

老规矩,兄弟们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

代码获取方式】

识别文末二维码,回复:python

听说你的程序又双叒叕乱码了相关推荐

  1. 由web程序出现乱码开始挖掘(Bom头、字符集与乱码)

    从第一次开始写web程序,自己还有身边同事开发出现乱码情况基本都没有消停过.估计以后还会一样继续. 这么些年,不断修修改改,也总结也归纳.程序从asp,asp.net,jsp,php,服务器从wind ...

  2. linux安装 中文乱码怎么解决方法,Linux安装GBK/GB2312程序显示乱码的五种解决方法...

    不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,接下来是小编为大家收集的Linux安装GBK/GB2312 ...

  3. linux服务器程序乱码,Linux安装GBK/GB2312程序显示乱码的五种解决方法

    不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,下面小编就给大家介绍下Linux安装GBK或GB2312程 ...

  4. 在Win7系统下, 使用VS2015 打开带有日文注释程序出现乱码的解决方案

    在Win7系统下, 使用VS2015 打开带有日文注释程序出现乱码的解决方案 参考文章: (1)在Win7系统下, 使用VS2015 打开带有日文注释程序出现乱码的解决方案 (2)https://ww ...

  5. Linux安装gbk字体,Linux安装GBK/GB2312程序显示乱码的五种解决方法 - 软件教程网

    不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,下面小编就给大家介绍下Linux安装GBK或GB2312程 ...

  6. java程序出现乱码的原因

    Java程序出现乱码的原因有以下几种可能: 编码不一致:Java程序使用的编码与当前系统或其他应用程序使用的编码不一致,导致字符无法正确显示. 字符集不支持:Java程序使用的字符集不支持某些特殊字符 ...

  7. 转 Applocale:非Unicode程序界面乱码解决方法笔记

    转 Applocale:非Unicode程序界面乱码解决方法笔记 2008年11月25日 星期二 下午 1:33 注: 为了不让 pAppLocale 消失 我也做了个下载备份 地址: http:// ...

  8. 用计算机都会听错数字怎么回事,由web程序出现乱码开始挖掘(Bom头、字符集与乱码)...

    从第一次开始写web程序,自己还有身边同事开发出现乱码情况基本都没有消停过.估 计以后还会一样继续. 这么些年,不断修修改改,也总结也归纳.程序从asp,asp.net,jsp,php,服务器从win ...

  9. Linux下Java程序中文乱码问题研究

    Linux下Java程序中文乱码问题研究 摘  要:在一个项目的开发中,我用linux内核源代码和busybox源代码自己编译打造的操作系统mylinux 1.0 ,服务器是我用java语言自己编写的 ...

最新文章

  1. Ajax与JSON的一些总结(转)
  2. python 安装第三方库pygame
  3. MICROSOFT VISUAL STUDIO COMMUNITY 2015软件许可条款
  4. java多线程必须掌握吗_多线程模式有什么作用(java多线程必须掌握的知识)
  5. 550什么意思_研报翻译官第二期:带你了解什么是CPI
  6. 为什么同大取大同小取小_不锈钢马大型动物雕塑-大同金属雕塑马订制
  7. 暑期训练日志----2018.7.31
  8. hfss仿真时间过长怎么解决_一文详解相控阵天线仿真技术
  9. java面试题及答案 JAVA相关基础知识
  10. knx智能照明控制系统电路图_智能照明控制系统(KNX)教材
  11. excel粘贴时出现故障_excel无法复制粘贴怎么办?告诉你解决方法
  12. Cesium中获取坐标点地形高程的方法
  13. golang使用image包及draw.Draw合成图片
  14. COJ 0580 4021征兵方案
  15. 单片机遥控开关mos管
  16. 半入耳式蓝牙耳机哪款音质好?音质最好的半入耳蓝牙耳机推荐
  17. 网络安全岗位介绍——等级保护测评师
  18. read write file
  19. word报错“您的组织策略阻止我们为您完成此操作”的解决方法
  20. Recorder︱一些图像识别初创公司产品及API搜集ing...

热门文章

  1. Java中var类型的用法
  2. 记一个python scrapy爬取script标签中某个var变量的值
  3. 谷歌浏览器上传图片或任何文件都卡死
  4. Python 实现发红包
  5. 论文:FPG,特征金字塔网格
  6. 桌面运维工程师的网站收藏夹
  7. 罗丹明RB/四甲基罗丹明标记软骨素chondroitin, Rhodamine B/TRITC labeled;Rhodamine B/TRITC-chondroitin
  8. 数据结构笔记 —— 二叉树(前序、中序、后序遍历和查找)
  9. IoT高级设备检索——设备管理运维类
  10. cesium实现线圈发光效果