Python - 字符编码笔记 ASCII Unicode UTF-8

时间:2023-01-05 10:15:16

0.引言

最近看了一篇博客 【 程序员技术练级攻略 】,于是打算从头开始学起,首先就是Python脚本,处理本地的文件并进行统计文件中的汉字的个数。在这个过程中 遇到了文本中汉字的提取识别的问题,遂完成此文介绍字符编码方面的一点入门知识,内容为各个博客的汇总,在此谢谢前人的贡献,使得后生可以恭读。

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
 

参考文档:

http://zh.wikipedia.org/zh-cn/ASCII

http://zh.wikipedia.org/wiki/Unicode

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

http://www.cnblogs.com/sislcb/archive/2008/11/26/1341453.html

http://blog.csdn.net/zm2714/article/details/8012474