python2编码详解、一

编程入门 行业动态 更新时间:2024-10-13 04:23:58

2019独角兽企业重金招聘Python工程师标准>>>

以前使用python3没觉的什么,跟着公司使用python2后被编码问题折磨的痛不欲生,好好研究了一下编码问题,参考了很多博文,加入自己的理解,这里只是对编码的介绍,下一篇是python2中编码问题的详解!

关于编码介绍:

	众所周知,计算机内部只有0和1,只可以存储和处理二进制数据,因此任何字符也是由01串组成,从文字或符号到计算机可以识别的二进制数之间需要一个映射关系,这个唯一的映射关系也称为字符编码(character encoding)就是字集码。
	再具体的说对于“编码”有两个含义:
	一、字符到存储或者存储转为字符的处理过程,是一个动词,包括两个过程,首先从映射表中找到对应的二进制编码,然后把这个二进制编码按照存储规则存储。
	二、“映射关系、存储规则”,是一个名词,包含两部分,1.是字符到二进制的映射关系(通常理解),2.是二进制的存储规则。
		例子(虚构)
			映射关系:字符“我”->00001111。
			存储规则:00001111可以存为00001111,也可存为1111,简单理解为长度不同。
	为了运算方便,规定8个bit组成一个字节(Byte),字符表达的最小单位就是字节,即一个字符占用一个或者多个字节。

最初的ASCII编码

	计算机发源于美国,使用的是英文字母(字符),所有26个字母的大小写加上数字0到10,加上符号和控制字符,用一个字节(8个bit)就能表示所有的字符,这就是ANSI的“Ascii”编码(American Standard Code for Information)。标准 ASCII 码使用 7 个二进位对字符进行编码,对应的 ISO 标准为 ISO646 标准。但由于计算机基本处理单位为字节( 1byte = 8bit ),所以一般仍以一个字节来存放一个 ASCII 字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为 0 (在数据传输时可用作奇偶校验位)。后来又划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。目前使用最广泛的西文字符集及编码也是 ASCII 字符集和 ASCII 码( ASCII 是 American Standard Code for Information Interchange 的缩写),它同时也被国际标准化组织( International Organization for Standardization, ISO )批准为国际标准。

各个地区各自编码

当计算机广泛推广到各个地区国家时发现各个地区国家都有各自的的符号和文字,ASCII编码不能将这些符号映射到计算机内部处理,于是各个国家又制定了自己的标准字符集编码,比如中国汉字这么多,一个字节表示不下,于是有了GB2312(中国国家标准简体中文字符集)。GB2312使用两个字节来对一个字符进行编码,其中前面的一个字节(称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,GB2312能表示几千个汉字,而且与asill码也是兼容的。其他国家和地区还有拉丁什么编码基本用不到。(后面复制了关于GBK,GB2312的材料)

ANSI编码

	上面那些使用 多 个字节来代表各种各个国家地区文字符号延伸编码方式,统称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)"。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,所以在中文 windows下要转码成gb2312,gbk只需要把文本保存为ANSI 编码即可。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

unicode编码

	当各个国家都有自己的编码,甚至还不止一套时,暴露出一个很大的缺点是,同一个编码值在不同的编码体系里代表着不同的字。这样一起使用时就容易造成混乱,分开使用又不好互相通信兼容。最终导致了unicode码(万国码)的诞生。其中每个语言下的ANSI编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。这种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。Unicode当然是一个很大的集合,采用32位二进制(4字节)表示一个字符,这样便可以一套编码对应多种不同语言。现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。
	Unicode是一个以’U+’字符开头,后面跟着4位或者5位或者6位十六进制数字,那么接下来的问题就是如何把Unicode码点映射到二进制字节上,常用的码点映射方式有UTF-16、UTF-32,UTF-8。单字节的ASCII码字符仍然映射的是单字节,而且ASCII编码方式是UTF-8的子集。

UTF-8、UTF-16等

	Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。为了提高Unicode的编码效率,于是就出现了UTF系列编码。UTF-32中,每个字符固定占4字节,按照Unicode编码完全映射。UTF-8和UTF-16则属于变长编码,分别使用最少1个(UTF-8)或2个(UTF-16)字节到最多4个字节来编码。UTF-8最大的一个特点,就是它是一种变长的编码方式,可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。
	UTF-8的编码规则很简单,只有二条:
	1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
	2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

众编码之间的关系(重点):

	之前出现的编码,如ASCII编码,gbk编码,gb2312编码都包含两部分,既映射关系(规则/名称)与映射方式(动词),映射关系可理解是一个字符对应的二进制映射表,映射方式是将字符映射到对应的二进制数后怎么存储的问题,这些编码(如ASCII编码,gbk编码,gb2312编码)既有自己的映射表,又有自己的映射方式(专有名称为编码器)。
	而unicode只是一个编码规范,是所有字符对应二进制的集合(名称,简单理解为映射表),而没有具体的编码存储规则。或者说,unicode是表现形式,而不是存储形式,就是说没用定义每个字符是如何以二进制的形式存储的。这个就跟ASCII编码,gbk编码,gb2312编码这些不一样,这些编码的表现形式即存储形式。unicode的二进制形式是与终端的编码格式无关的,因为它只是一个固定的映射关系。
	UTF-8、UTF-16、UTF-32就是unicode的存储形式。比如什么样的二进制数用几个字节存储。

总结:

	ASCII编码只能映射少数256个西文字符,是一个通用国际标准,包括从映射到存储。
	GBK编码,GB2312编码,latin编码...是各个地区自己制定的映射,包括从映射到存储。
	unicode编码,是一个全球通用的映射关系,可以将任何字符映射到唯一的二进制编码上。
	UTF-8/UTF-16编码,是unicode编码下的存储方式,使用的映射关系就是unicode编码关系。

扩展材料:

	GB2312 也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为GB 2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB 2312。由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。首先构造一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,然后将所有字符依照下表的规律填写到方阵中。这样所有的字符在方阵中都有一个唯一的位置,这个位置可以用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出现在第16区的第1位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是一一对应的。这样所有的字符都可通过其区位码转换为数字编码信息。GB2312编码用两个字节(8位2进制)表示一个汉字,所以理论上最多可以表示256×256=65536个汉字。但这种编码方式也仅仅在中国行得通,如果您的网页使用的GB2312编码,那么很多外国人在浏览你的网页时就可能无法正常显示,因为其浏览器不支持GB2312编码。当然,中国人在浏览外国网页(比如日文)时,也会出现乱码或无法打开的情况,因为我们的浏览器没有安装日文的编码表。
	GB2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK同Gb2312一样,两个字节表示一个字符,但区别在于,放宽了对低字节的要求,因此能表示的范围扩大到了20000多。后来,为了容纳少数名族,以及其他汉字国家的文字,出现了GB13080。GB13080是兼容GBK与GB2312的,能容纳更多的字符,与GBK与GB2312不同的是,GB18030采用单字节、双字节和四字节三种方式对字符编码。GBK采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在40-FE 之间,剔除 xx7F一条线。总计23940 个码位,共收入21886个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号883 个。P-Windows3.2和苹果OS以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码。有些汉字用五笔和拼音都打不出来,如:溙(五笔IDWI),须调出GBK字符集才能打出这个字。极品五笔中可右击输入法图标,设置,属性中选GBK字符集。极点五笔中可点击工具条中相关图标进行转换。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,1980年由国家标准总局发布。基本集共收入汉字6763个和非汉字图形字符682个,通行于中国大陆。新加坡等地也使用此编码。GBK是对GB2312-80的扩展,也就是CP936字码表 (Code Page 936)的扩展(之前CP936和GB 2312-80一模一样)。
	在台湾、香港与澳门地区,使用的是繁体中文字符集。而1980年发布的GB2312面向简体中文字符集,并不支持繁体汉字。在这些使用繁体中文字符集的地区,一度出现过很多不同厂商提出的字符集编码,这些编码彼此互不兼容,造成了信息交流的困难。为统一繁体字符集编码,1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众一同制定了一种繁体中文编码方案,因其来源被称为五大码,英文写作Big5,后来按英文翻译回汉字后,普遍被称为大五码。大五码是一种繁体中文汉字字符集,其中繁体汉字13053个,808个标点符号、希腊字母及特殊符号。大五码的编码码表直接针对存储而设计,每个字符统一使用两个字节存储表示。第1字节范围81H-FEH,避开了同ASCII码的冲突,第2字节范围是40H-7EH和A1H-FEH。因为Big5的字符编码范围同GB2312字符的存储码范围存在冲突,所以在同一正文不能对两种字符集的字符同时支持。
	就汉字而言,三种编码方式的表示范围是:
	GB18030 > GBK > GB2312
	即GBK是GB2312的超集,GB1803又是GBK的超集。一个汉字可以用GBK表示,但不一定能被GB2312所表示。

转载于:https://my.oschina/u/3726752/blog/2249971

更多推荐

python2编码详解、一

本文发布于:2023-06-14 08:00:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1453637.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:详解

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!