ASCII、Unicode、UTF-8、GBK、GB2312、解码、编码初体验

ASCII、Unicode、UTF-8、GBK、GB2312、解码、编码初体验

引言

工作中时常会遇到解码、编码方面的问题,如:写的脚本输出乱码、写的程序抛出解码异常或编码异常等等。个人认为这些都应该是对各个字符编码标准和解码编码概念理解不到位所致,这里先记录下自己目前的学习情况仅供参考。

字符集和字符编码

维基百科:
术语字符编码(character encoding),字符映射(character map),字符集(character set)或者代码页,在历史上往往是同义概念。

百度百科:
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合。

维基百科、百度百科:
字符编码(Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位元组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。

从以上引用可以看出:这些概念实际上描述了同一件事,就是将自然语言(例如英文、中文等)里头的字、符号给映射到某个集合(例如ASCII、GBK等字符集)。这一点我感觉类似于儿时数学书上说的函数的概念,y = f(x)。

解码和编码

了解字符集、字符编码之后再来看解码编码就很容易理解了。解码可以看做将存储或传输的信号按照指定的字符编码从某个集合转换成它所表示的信息、数据(例如自然语言英文中文等)。而编码就是解码的逆过程,将信息、数据按照指定的字符编码给转换成规定的数码信号。这俩过程给我的感受就类似于儿时学英语时的查字典,汉译英、英译汉。

ASCII

维基百科:
ASCII94269(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC 646。

之前总结了一篇有关ASCII表的博文(跳转),可以看出该字符编码仅仅包含了大小写拉丁字母、数字和一堆英文符号,所以普适性不强。Python2中默认编码方式为ASCII,但可以在python的Lib\site-packages文件夹下新建一个sitecustomize.py来重置其默认编码,例如:

#encoding=utf-8  
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

Unicode

维基百科:
Unicode(万国码、国际码、统一码、单一码)是电脑科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。

注意,该标准的编码方式和实现方式是不一样的。目前的Unicode版本采用16位编码空间(两个字节),可以编码65536(216)个字符。而Unicode的实现方式称为Unicode转换格式即UTF(Unicode Transformation Format),例如UTF-8、UTF-16、UTF-32等等均属于Unicode的实现方式。Java中默认编码方式为Unicode,class文件为UTF-8,JVM运行时为UTF-16。

个人理解之所以设计这么多实现方式,是因为各个平台设计都不相同,而为了统一使用Unicode编码造成的。例如:在UTF-16实现方式中使用两个字节表示一个BMP字符,在Windows和Linux系统中默认使用UTF-16 LE(Little-Endian,小端序),而在Mac系统中默认使用UTF-16 BE(Big-Endian,大端序)。大小端序是指多字节数据的字节排序,若是按照先低位字节后高位字节的方式记录则为小端序,反之则是大端序(有关字节顺序请跳转)。

UTF-8

维基百科:
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前置码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII相容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他储存或传送文字优先采用的编码。

个人理解就是UTF-8实际上是为了更方便使用Unicode这一普适性强的编码方式。例如:我要存储或传输的文件几乎都是ASCII码能够表示的数据,对于单个字符如果用可变步长的UTF-8我只需要一个字节就能进行编码了,相比Unicode的两个字节我可以节省一半的编码空间,整个文件下来我就能不浪费相当多(接近一半)的空间。

GBK

维基百科:
汉字内码扩展规范,称GBK,全名为《汉字内码扩展规范(GBK)》1.0版,GBK 只为“技术规范指导性文件”,不属于国家标准。

个人理解就是这个是对GB2312的扩展,并且兼容GB2312。

GB2312

维基百科:
GB 2312 或 GB 2312–80 是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,通常简称GB,又称GB0,由中国国家标准总局发布。GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。但对于人名、古汉语等方面出现的罕用字和繁体字,GB 2312不能处理,因此后来GBK及GB 18030汉字字符集相继出现以解决这些问题。

个人理解就是一般汉字这个标准就足够了,极少一部分汉字这个标准里没有,所有才有了后来的GBK等等字符集。同时GB2312是可以兼容ASCII的。

猜你喜欢

转载自blog.csdn.net/weixin_44256803/article/details/88557056