python 零基础学习(六)

GetItMore2019-06-29 00:06:54

主题:python 中的字符编码


字符编码问题是所有编程语言都会涉及的一个问题,也是程序猿必须面对的,虽然让人头疼。这章主题介绍python 中的字符编码,一方面介绍字符编码的常识,另一方面介绍 python 语言处理字符编码的方式。

一连串的问题

问题一:ASCII 是啥?

ASCII 编码全称是:American Standard Code for Information Interchange(美国信息交换标准代码),是字符编码阶段一时期的产物。在计算机中存储的所有内容都是二进制(0、1串)形式,而计算机是在语言符号比较简单的美国诞生,他们的语言符号比较少,比如 a、b、c 等,要让每一个字符与一个数字对应,使用 8 位二进制(1 个字节)串就足够了,这种 8 位二进制串对应的数字就是它们所表示字符的 ASCII 编码。下图就是 ASCII 码对照表:

问题二:GBK 是啥?

GBK 的全称一说叫:汉字内码扩展规范;另一说叫:汉字国标扩展码。这些都不重要,其实就是汉字编码的一种,当计算机传入中国以后,中国的汉字比 ASCII 编码所能表示的字符数量要多很多,所以为了满足中文表示,我们就制定了 GBK,使用 2 个字节来表示一个字符,这就是字符编码阶段二时期的产物。

问题三:UNICODE 是啥?

UNICODE ,又叫同一码、又叫万国码。是随着计算机的使用越来越广,各个国家都需要对本国的语言字符进行相应的编码,所以越来越多的编码规范被定制,如果独立使用当然没有问题,但是这对于各国之间的交流就很不方便了,所以为了解决字符编码的局限问题并对各国字符编码进行统一,ISO(国际标准化组织)就制定了 UNICODE 编码。UNICODE 是字符编码阶段三时期的产物,通常使用 2 个字节进行编码。

问题四:UTF-8 是啥?

严格意义来说,Unicode 只是一种标准,它对全世界的文字进行了统一的编码,但没有规定如何在计算机种进行存储。所以这个时候有了 UTF-8,它是 Unicode 标准的一种实现方案,是一种变长编码,使用 1 到 6 个字节编码 Unicode 字符。UTF-8 的编码规则是:

  1. 如果只有一个字节则其最高二进制位为 0;

  2. 如果是多字节,其第一个字节从最高位开始,连续的二进制位值为 1 的个数决定了其编码的字节数,其余各字节均以 10 开始。

字节数表现形式
1 个字节0XXXXXXX
2 个字节11000000 10XXXXXX
3 个字节11100000 10XXXXXX 10XXXXXX
4 个字节依次类推
5 个字节依次类推
6 个字节依次类推

问题五:ANSI 是啥?

问题三中说到 GBK 是中文汉字的一种编码标准,而不同的国家和地区都定制了不同的标准,这些使用多个字节编码一个字符的编码方式就是 ANSI 编码,由此可知 ANSI 不是一种编码,在不同的计算机操作系统中 ANSI 所代表的是不同的编码。比如在简体中文 Windows 操作系统中,ANSI 编码代表 GBK 编码;在日文 Windows 操作系统中,ANSI 编码代表 Shift_JIS 编码。所以在不同的操作系统中传递以 ANSI 编码格式保存的文件经常会出现乱码问题。

两对名词解释

转自:[http://python.jobbole.com/88264/]

字节和字符

计算机存储的一切数据,都是由一串01的字节序列构成的,一个字节等于8个比特位。而字符就是一个符号,比如一个汉字、一个英文字母、一个数字、一个标点都可以称为一个字符。字节方便存储和网络传输,而字符用于显示,方便阅读。

编码和解码

我们用编辑器打开的文本,看到的一个个字符,最终保存在磁盘的时候都是以二进制字节序列形式存起来的。那么从字符到字节的转换过程就叫做编码(encode),反过来叫做解码(decode),两者是一个可逆的过程。编码是为了存储传输,解码是为了方便显示阅读。

python 中的字符编码

python 2.7 中的字符编码

str 和 unicode 类型

python 2.7 中默认的编码方式是 ASCII,我们知道 ASCII 编码的局限性,所以 python 2 对中文等类型的支持不是很好。而字符串又有两个常用的表示类型:str 和 unicode。这两种类型都是由 basestring 派生出来的,其中 str 类型的方式类似于一个字节数组,无论字符串中的字符是用几个字节进行编码,所表现出来的形式是一串字节数组,当访问 str 类型字符串的第 i 位数据时,访问到的是第 i 个字节的值,而不是 str 字符串中第 i 个字符;相比之下, unicode 类型字符存储的时候就自带了字符编码,字符串中的字符是由几个字节进行编码的,存储时该位置就有几个字节组成,也就是说存储和使用的时候是按照 UTF-8 格式,unicode 类型字符串在表示时,前面加 u,可以使用 type() 函数来查看字符串的类型。

动态展示:

encode 和 decode 函数

encode 使用的对象是 unicode 类型字符串,得到的结果是 str 类型的字符串,它的功能是将 unicode 类型字符串按照指定的编码方式进行编码:

unicode.encode("字符编码")=str

decode 使用的对象是 str 类型字符串,得到的结果是 unicode 类型的字符串,它的功能是将 str 类型字符串按照指定的编码方式进行解码:

str.decode("字符编码")=unicode

动态展示:

提示:在使用 encode 对 unicode 类型字符串进行编码时,所指定的字符编码必须涵盖原始字符串的符号,比如对字符串 “中文” 进行 encode 的时,就不能使用 ascii 编码,因为ascii 编码的字符集中就不包含中文字符;同样,解码时也要注意,尽量保证使用什么方式编码就要用同样的方式解码。

python 3.6 中的字符编码

str 和 bytes 类型

python 3 对 python 2 中存在的字符编码问题进行了改进。首先 python 3 中默认使用 utf-8 编码;其次是对文本字符和二进制数据做了明显的区分:文本字符串类型为 str,二进制字节数据则使用新定义了一种 bytes 类型进行表示,字节串开头为 b。python 2 和 python 3 对比如下:

python 版本字节类型字符类型
python 2strunicode
python 3bytesstr

encode 和 decode 函数

encode 函数对 str 类型字符串进行编码,结果为 bytes 类型字节串,默认使用 utf-8 编码解码;

decode 函数对 bytes 字节串进行解码,结果为 str 类型字符串,默认使用 utf-8 编码方式解码。

动态展示:

文章到此结束,有需要讨论的地方尽请留言。

能动手就别站着