中文问题
编写中文程序的方法:
- 使用中文需要在第一行声明编码#encoding=utf-8
- 文件保存为utf-8编码格式,在文件中的中文字符串需要使用u,例如:u‘中文‘
- 因为python 只检查 #、coding 和编码字符串,所以你可能会见到下面的声明方式,这是有些人为了美观等原因才这样写的: #-*- coding: UTF-8 -*-
常见编码:
- GB2312编码:适用于汉字处理、汉字通信等系统之间的信息交换
- GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码
- ANSI是与你使用的windows操作系统的语言有关系的,向windows 7 简体中文版就是GBK(用一个字节表示英文,用两个字节表示一个中文)
- ASCII编码:是对英语字符和二进制之间的关系做的统一规定
- Unicode编码:这是一种世界上所有字符的编码,但是它没有规定的存储方式。
- UTF-8编码:是 Unicode Transformation Format - 8 bit 的缩写, UTF-8 是 Unicode 的一种实现方式。它是可变长的编码方式,可以使用 1~4 个字节表示一个字符,可根据不同的符号而变化字节长度。
两种类型的字符串类型
- 字节字符串:一个字节字符串就是一个包含字节列表。类型:str
一个字节字符串就是一个包含字节列表<type ‘str‘> <type ‘unicode‘>。 当需要的时候,Python根据电脑默认的locale设置将字节转化成字符。 在Mac OX上默认的编码是UTF-8,但是在别的系统上,大部分是ASCII。
#创建一个字节字符串
byteString = "hello world! "
代码示例:
#-*- coding: UTF-8 -*-
s = "hello normal string"
print u"字节字符串",type(s)
u = s.decode("UTF-8" )
print u"Unicode字符串",type(u)
backToBytes = u.encode( "UTF-8" )
print u"字节字符串",type(backToBytes)
更多解释:
现在,字节字符串s就被当成一个UTF-8字节列表去创建一个Unicode字符串u, 下一行用UTF-8表示的字符串u转换成字节字符串backToBytes.
- Unicode的字符串,类型:unicode
#创建一个Unicode字符串:
unicodeString = u"hello Unicode world!"
编码转换
Python内部的字符串一般都是 Unicode编码。代码中字符串的默认编码与代码文件本身的编码是一致的。所以要做一些编码转换通常是要以Unicode作为中间编码进行转换的,即先将其他编码的字符串解码(decode)成 Unicode,再从 Unicode编码(encode)成另一种编码。
Ø decode 的作用是将其他编码的字符串转换成 Unicode 编码,例如:name.decode(“GB2312”),表示将GB2312编码的字符串name转换成Unicode编码
Ø encode 的作用是将Unicode编码转换成其他编码的字符串,例如: name.encode(”GB2312“),表示将unicode字符串name转换成GB2312编码
Ø 进行编码转换的时候必须先知道 name 是那种编码,然后 decode 成 Unicode 编码,最后载 encode 成需要编码的编码
Ø name 已经就是 Unicode 编码了,那么就不需要进行 decode 进行解码转换了,直接用 encode 就可以编码成你所需要的编码
Ø 对中文这类的unicode字符进行decode会报错
文件的编码:
Ø 在UTF-8文件中,则这个字符串就是 UTF-8编码的,它的编码取决于当前的文本编码
Ø GB2312文本的编码就是GB2312
Ø 在同一个文本中进行两种编码的输出等操作就必须进行编码的转换,先用decode将文本原来的编码转换成Unicode,再用encode将编码转换成需要转换成的编码
例子:
#-*- coding: UTF-8 -*-
fp1 = open(‘d:\\testfile.txt‘, ‘r‘) #手工创建文件为ANSI编码保存(gbk)
info1 = fp1.read()
# 已知是 GBK 编码,解码成 Unicode、
tmp = info1.decode(‘GBK‘)
fp2 = open(‘d:\\testfile.txt‘, ‘w‘)
# 编码成 UTF-8 编码的 str
info2 = tmp.encode(‘UTF-8‘)
fp2.write(info2) #写入utf8字符,并进行保存
fp2.close() #文件会变为utf-8编码保存