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的值为:'xe5x93x88xe5x93x88'(哈哈的utf-8编码)

b.如果文件格式为gbk,则str的值为:'xb9xfexb9xfe'(哈哈的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的字节序:'xe5x93x88xe5x93x88'

b)解释器读取是读的字节序:'xe5x93x88xe5x93x88'

c)ss= u'哈哈' ,解释器将字节序列'xe5x93x88xe5x93x88'按照.py中声明的coding方式(此处为gbk)进行译码为unicode:u'u935du581du6431'

d)print repr(ss)输出的是u'u935du581du6431'

6.unicode是一种类型,不同于字节,它其实是占两个字节

>>> b = 'xe5x93x88xe5x93x88'.decode('gbk')
>>> b
u'u935du581du6431'
>>> b[0]
u'u935d'
>>> len(b)
3
>>> type(b[0])
<type 'unicode'>

unicode与文件IO、控制台交互时都是要先按照其他编码方式编码成字节流的,否则会出错。

7.字节数组str是一种类型,每个元素占一个字节

>>> a = 'xe5x93x88xe5x93x88'
>>> a
'xe5x93x88xe5x93x88'
>>> len(a)
6
>>> a[0]
'xe5'
>>> type(a[0])
<type 'str'>

原文地址:https://www.cnblogs.com/DjangoBlog/p/3546762.html