Python字符编码

小菜UP 2018-05-08 22:27:27

理解字符编码之前,先了解一些基础的字节、字符、字符集、字符码、字符编码。

字节

字节(byte),是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于有八位(二进制位),一个中文字占2个字节。无论保存在磁盘还是网络传输上的数据(文字、图片、视频、音频)都是由字节组成的。

8bit(位)=1Byte(字节)

1024Byte(字节)=1KB

1024KB=1MB

1024MB=1GB

1024GB=1TB

字符

字符(Character)是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等

字符集

字符集(Character set)是多个(某个范围)字符的集合,字符集种类较多,每个字符集包含的字符个数不同。

比如ASCII 字符集总共有128个字符,包含了英文字母、阿拉伯数字,标点符号和控制符。而GB2312字符集定义了

7445个字符,包含了绝大部分分汉字。

字符码

字符码(Code Point)是指字符集中的字符对应的数字编号,例如ASCII中字符集用0-127分别表示128个字符,“A" 在字符编码就是65。

字符编码

字符编码(Character encoding) 是将字符集中的字符码映射为字节流的一种具体实现方案,常见的字符编码有ASCII编码、UTF-8编码、GBK编码等,某种意义上来说,字符集与字符编码有某种对应关系,例如ASCII字符集有对应ASCII编码。ASCII字符编码规定使用单字节中低位的7个比特去编码所有的字符。

例如“A” 的字符集编号是65,用单字节表示就是0x41,因此写入存储设备的时候就是b'01000001'

编码、解码

编码过程:就是将字符转换成字节流。

解码过程:就是将字符流解析为字符。

ASCII 编码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。

国际标准的ASCII只有128位

Python字符编码

扩展ASCII编码达到256位

Python字符编码

Unicode

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode存在的问题

Unicode是一个符号集,它规定了符号的二进制代码,却没有规定二进制代码如何储存。

出现了 Unicode 的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示 Unicode。Unicode 在很长一段时间内无法推广,直到互联网的出现。

UTF-8

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的

2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

Python中的编码

python2默认编码是ASCII, python3里默认是unicode

unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间

在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

GBK需要转换为UTF-8格式流程:

1、首先通过编码【decode】转换为Unicode编码

2、然后通过解码【encode】转換为UTF-8的编码

UTF-8需要转为为GBK格式流程:

1、首先通过编码【decode〗转換为Unicode编码

2、然后通过解码【encode】转换为GBK的编码