以下是我对编码的一些体会,只是很简单的根据经验来写的,并没有深入研究编码问题。
在 python 源代码文件中,如果你有用到非ASCII字符,则需要在文件头部进行字符编码的声明,声明如下:
# code: UTF-8
因为python 只检查 #、coding 和编码字符串,所以你可能回见到下面的声明方式,这是有些人为了美观等原因才这样写的:
#-*- coding: UTF-8 -*-
常见编码介绍:
GB2312编码:适用于汉字处理、汉字通信等系统之间的信息交换
GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码
UTF-8编码:是 Unicode Transformation Format - 8 bit 的缩写, UTF-8 是 Unicode 的一种实现方式。它是可变长的编码方式,可以使用 1~4 个字节表示一个字符,可根据不同的符号而变化字节长度。
ASCII码:是对英语字符和二进制之间的关系做的统一规定
Unicode码:这是一种世界上所有字符的编码。当然了它没有规定的存储方式。
好了,现在来总结了
总的来说,ASCII,GBK*,UNICODE
* 这三个规定了字符与二进制码之间的对应关系,是字符与编码之间的一一对应
* ASCII 占一个字节,只记录了一些基本的字符
* GBK* 占两个字节,他包含了 ASCII 和 所有的中文 字符
* UNICODE 占两个字节,包含了世界上所有的语言字符!所有的!
但是!
unicode 并没有规定统一的存储方式,于是就出现了utf-8.
什么意思呢?
就是说,文本如果按照GBK的编码方式来存储的话,电脑是可以识别并正常读取的,但按照UNICODE的编码方式来存储的话,电脑是无法识别出来的(2字节16位的所有组合跟 GBK 和 UNICODE 可不是一一对应的关系),最后只能以乱码的形式输出了 0。0
所以,如果要以unicode 存储的话,那必须声明存储方式才行,utf-8 就是其中一个存储方式。
好了,编码关系知道了,那说说encode与decode吧
encode 本意就是编码
encode 就是吧unicode字符 按照规定的方式进行编码,在内存中,或者在硬盘上。
decode 就是把编码解码成 unicode 字符,以供我们来识别。
要知道,信息传输都是以str 来传输的,当信息传输到其他地方的话,如果当地文件不是跟原来的编码方式一样,那就回出现乱码。
假如说,文件中有一存储着utf-8 的文件,一个python程序打开了,在一些情况下打开后可能呈现的形式就是乱码,这种情况下只要encode一下就行了,因为本来就是utf-8的形式。
但如果原来的文件是以 GBK 来存储的,那么打开文件后就得str.decode(’GBK’)来进行编码转换了。