1. ASCII编码
ASCII编码(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套编码系统,主要用于显示英语,被广泛使用直到2007年12月,逐渐被Unicode所取代。
在计算机内部,所有的信息都是用二进制来表示。每个二进制位(bit)拥有0和1两种状态。一个字节(byte)有八个二进制位,可以表示256种状态。
ASCII标准第一次发表是在1967年,最后一次更新则是在1986年。ASCII使用7位或者8位二进制组合来表示128种或者256种可能得字符。标准的ASCII共定义了128个字符;其中33个字符无法显示(这是以现今操作系统为依归,但在DOS模式下可显示出一些诸如笑脸、扑克牌花式等8-bit符号)。例如,数字0是48(二进制00110000),小写字母a是97(二进制01100001),小写字母z是122(二进制01111010),大写字母A是65(二进制01000001),大写字母Z是90(二进制01011010)。
2. Unicode
Unicode(统一码)是一种在计算机上使用的字符编码,为了解决传统的字符编码方案的局限而产生,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,1900年开始研发,1994年正式公布。Unicode只是一个符号集,只规定了符号的二进制代码,没有规定这个二进制代码应该如何存储。
3. UTF-8
UTF-8是在互联网上广泛使用的一种Unicode的实现方式,是一种针对Unicode的可变长度字符编码。由KenThompson于1992年创建。现在已经标准化为RFC3629。UTF-8用1到4个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
注:Unicode转换为UTF-8需要的字节数可以根据Unicode 二进制的位数除以6来计算。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
4. Python 2.X
4.1 字符串与Unicode
字符串在Python内部的表示是Unicode编码,因此在编码转换的时候,通常需要以Unicode作为中间编码,即先将其他编码的字符串解码(decode)成Unicode,再从Unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成Unicode编码,例如str.decode(“utf-8”),表示将utf-8编码的字符串转换成Unicode编码。
encode的作用是将Unicode编码转换成其他编码的字符串,例如str.encode(“utf-8”),表示将Unicode编码的字符串转换成utf-8编码。
如果字符串定义为:
str = u‘中文’
则该字符串的编码被指定为Unicode,即Python的内部编码,判断一个字符串是否为Unicode编码的方法是:
isinstance(s, unicode)
4.2 字符编码声明
如果在源代码文件中有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下所示:
<pre name="code" class="python">#-*- coding: UTF-8 -*-
4.3 读写文件
读取ANSI编码文件
建立一个文件test.txt,文件格式用ANSI,内容为:
abc中文
用python来读取
# coding=gbk
print open("Test.txt").read()
读取utf-8编码文件(无BOM)
把文件格式改成UTF-8:
结果:abc涓 枃
显然,这里需要解码:
# -*- coding: utf-8 -*-
import codecs
print open("Test.txt").read().decode("utf-8")
读取 utf-8 编码文件(有 BOM )
某些软件在保存一个以UTF-8编码的文件时,默认会在文件开始的地方插入三个不可见的字符(0xEF0xBB 0xBF,即BOM)。在有些软件可以控制是否插入BOM。如果在有BOM的情况下,在读取时需要自己去掉这些字符,python中的codecsmodule定义了这个常量:
# -*- coding: utf-8 -*-
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")
4.4 去掉文件中的非中文字符
for line in codecs.open(filename, 'r', ‘utf-8’):
for word in line:
if u'\u4E00' <= word <= u'\u9FA5' or u'\uF900' <= word <= u'\uFA2D':
do something