刚接触编程的时候,时不时会遇到程序乱码的问题。或者控制台输出乱码,或者数据库乱码,或者网页显示乱码。总之乱码无处不在,总会在不该出现的时候出现在不该出现的地方。
那么乱码是怎么回事呢?为什么好字会变成一堆乱七八糟的符号?
这时候你去网上搜索乱码,会发现一大堆文章向你扑来。看完之后,你更加沮丧,或者说你不知道为什么。今天,我们来探讨一下为什么程序会乱码。
ASCII 码
众所周知,计算机是从美国开始普及到全世界的。它们最初的用途是为美国军方服务,帮助人类做一些复杂的数学运算,比如计算导弹轨迹。
后来随着计算机的发展,人们发现这个工具简直太好用了,事实再一次证明了人类是多么贪婪。他们有更多的需求和欲望,比如想让电脑处理文字,控制打印机。这时候就不是处理数学运算那么简单了。因为电脑里全是0和1的二进制代码,怎么才能让电脑显示文字呢?于是发明电脑的大叔们做了一个字符和数字的对应。我们知道虽然单词很多,但是每个单词都是由26个字母组成的,只有52个单词是区分大小写的。一个8位字节可以有256种状态,加上数字和一些标点符号。一个字节就够了。
于是那些大叔们出于特殊目的,定义了从0开始的32种状态,比如打印机换行,彩色打印。然后将数字、标点符号、大小写字母一一编码,直到写出数字127,一共是128个码。最后,码表被赋予了一个很高的名字,叫做“ASCII码”或者“美国信息交换标准码”。
比如小写字母A对应的ASCII码值是97,十六进制0x61;数字0对应的ASCII码是48,十六进制0x30。ASCII码是计算机编码的基石。后面的代码都是在这个基础上改进的。
GBK 编码
后来随着时代的不断发展,计算机开始在世界范围内普及。日本、俄罗斯、中国和许多其他国家已经开始使用计算机,但是许多其他国家不使用英语。比如中国的汉字和英文字母差别很大,只有常用汉字才会有3000+。一个字节256个状态怎么够?
于是聪明的中国人发明了我们自己的编码系统,用两个字节来代表一个汉字或字符。第一个字节叫“高字节”(也叫区字节),第二个字节叫“低字节”(也叫位字节)。但是,这两个字节是有限的。“高字节”的使用范围是0xA1-0xF7,“低字节”的使用范围是0xA1-0xFE。
这样可以组合出8000个左右的汉字,足够日常使用。这个编码规则是“GB2312”。
如你所知,中国有着深厚的文化。只有8000个汉字怎么够?许多少数民族渴望使用电脑,许多人的名字仍然无法识别。因此,我们不限制高字节和低字节。只要发现第一个字节大于127,就认为是一个汉字的开头。为什么要大于127?因为兼容“ASCII码”,所以在127以内,表示该字节代表“ASCII码”。
这样2字节15位大概可以代表65536-127个汉字。
但是,港台地区没有使用大陆的GBK编码规则,因为他们使用繁体字,所以他们设计了自己的编码系统,称为“Big5”表,也称为Big Five或Big Five。
然后日本、韩国等不同国家也设计了自己独特的编码规则,因为是独立设计的,所以一个字符在不同的编码体系中很大概率不会对应同一个数字。那么就会出现非常奇怪的乱码现象。
比如,你的韩国女朋友给你发了一封邮件,邮件的真实内容是“什么?什么?什么?”。由于电子邮件是在韩国写的,计算机必须使用韩国编码系统。假设这三个字对应的代码是0xA6B2、0xA6B2、0xC132分别是。当你收到邮件时,因为你在中国,你必须使用GBK码解码,所以在将三个代码转换成汉字后,发现是“分手”。
我相信,这个时候,你一定看起来很傻,然后你开始怀疑自己是不是做错了什么。
天下大统
为了解决不同国家不同编码的问题,国际标准化组织制定了一套新的规则,称为“Unicode编码”。这套编码规则非常强大,可以囊括全人类的所有字符,包括人类离开非洲时使用的象形文字。
所以如果要包含这么多字符,至少需要三个字节。三个字节可以存储三百多万个字符,应该涵盖了所有文化的字符。不够的话,用四个字代表一个字符,大概可以组合21亿个字符,可能到地球毁灭的那一天就用完了。
然而,另一个问题也随之而来。因为欧美大部分用英语,一个字节就足够表达了。现在让他们用三个字节会造成空之间的巨大浪费。废品率高达2/3。做过网络编程的朋友都知道,网络中的数据传输需要很大的成本,而且不可靠。字节越多,浪费的资源就越多。
于是,在接下来的时间里,出现了多种Unicode的具体编码方式,即UTF-8、UTF-16和UTF-32,其中UTF-8占用1到4个字节,UTF-16占用2到4个字节,UTF-32占用4个字节。显然,UTF-8的设计更加合理。欧美字符存储一个字节,中文或其他字符存储两三个字节。是不是很美?
从此,天下一统。呃,不是,是已经统一的电脑代码,世界上没有乱码。
总结
今天,我们详细介绍了编码的历史,以及乱码的原因。下次遇到乱码也不会慌。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。