python编码问题
1.str
str是字节数组,里面存放的是unicode经过编码(可以是gbk、utf8、anscii等等)之后的字节序列。系统需要根据sys中的默认编码方式对str进行decode为unicode,可以通过sys.getdefaultencoding()活得系统默认编码方式。也可以根据sys.setdefaultencoding('gbk')更改默认编码方式。一般默认编码是anscii。
至于reload(sys)是因为Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入。
字节序str是一切编码之后的存储方式。unicode是最基本的源码,其他码都是从unicode基础上编码成字节序列的。
2.IO操作
IO操作例如:
open("Test.txt").read()是根据文件的编码(将文本编码成字节序列存放)然后读取的字节序列。字节序列即 str,要译码成unicode,需要按照原来文件的编码。
有BOM(编码格式,3个字节)的需要去掉BOM再读取内容,否则会出错:
# coding=gbk
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")
结果:abc中文
3.print控制台的输出
print语句它的实现是将要输出的内容传送到操作系统,操作系统会根据系统的编码(sys.getdefaultencoding())对输入的字节流进行译码显示。
4.python源文件.py中定义的编码声明
通常在py文件开头定义:
#!/usr/bin/env python
#coding=utf-8
源文件的编码格式决定了在该源文件中声明的字符串的编码格式,例如
test.py文件中有
str = '哈哈'
print repr(str)
a.如果文件格式为utf-8,则str的值为:'\xe5\x93\x88\xe5\x93\x88'(哈哈的utf-8编码)
b.如果文件格式为gbk,则str的值为:'\xb9\xfe\xb9\xfe'(哈哈的gbk编码)
5.中文处理过程
1)来源:
文件IO读入:是将中文字符按照文件格式编码成字节序列,存放起来。读取的时候读的字节序列。
*.py程序中直接赋值为中文字符串:中文字符串也会编码encoding并按照字节序列存入堆栈变量。这个encoding是根据*.py源文件的#coding=encoding 来确认编码方式的。
其实源文件自己保存时还有一个编码格式,因为代码自身也是一个字节序列存放的,类似于文本。此处称为文件文本格式编码。因此*.py程序中的中文首先是按照文件文本格式编码成字节序列。然后解释器会load该源文件的字节序列并解释成二进制代码。
例如 test.py文件文本格式为utf-8
#!/usr/bin/env python
#coding=gbk
ss = u'哈哈'
print repr(ss)
print 'ss:%s' % ss
a)test.py文件文本格式为utf-8,存放时时将 '哈哈'存成utf-8的字节序:'\xe5\x93\x88\xe5\x93\x88'
b)解释器读取是读的字节序:'\xe5\x93\x88\xe5\x93\x88'
c)ss= u'哈哈' ,解释器将字节序列'\xe5\x93\x88\xe5\x93\x88'按照.py中声明的coding方式(此处为gbk)进行译码为unicode:u'\u935d\u581d\u6431'
d)print repr(ss)输出的是u'\u935d\u581d\u6431'
6.unicode是一种类型,不同于字节,它其实是占两个字节
>>> b = '\xe5\x93\x88\xe5\x93\x88'.decode('gbk')
>>> b
u'\u935d\u581d\u6431'
>>> b[0]
u'\u935d'
>>> len(b)
3
>>> type(b[0])
<type 'unicode'>
unicode与文件IO、控制台交互时都是要先按照其他编码方式编码成字节流的,否则会出错。
7.字节数组str是一种类型,每个元素占一个字节
>>> a = '\xe5\x93\x88\xe5\x93\x88'
>>> a
'\xe5\x93\x88\xe5\x93\x88'
>>> len(a)
6
>>> a[0]
'\xe5'
>>> type(a[0])
<type 'str'>