您的位置:首页 > 编程语言 > Python开发

python 编码小结

2015-06-30 14:32 330 查看
str VS unicode

python中有两种类型的字符串,分别是str和unicode,其中str是字符串的某种编码的字节流,unicode类型的字符串用的是UCS-2编码。

默认编码

python2的默认编码为ASCII。可以通过sys.getdefaultencoding()得到。当没有编码声明时就会用默认编码来解码源文件中的str类型字符串。

源文件编码VS编码声明

python源文件的头部声明源文件的编码格式,如#coding:utf-8。python中的源文件编码最好和编码声明一致,否则会出现解码错误。

1 #coding:uft-8
2
3 s = u"中国"


将上面的代码保存成gbk格式的.py文件,执行后会出现如下的错误:



python会用声明的编码去解码代码中的str类型字符串,比如执行到s=u"中国"时,此时的"中国"是一个str类型字符串,内容为"0xd6 0xd0 0xb9 0xfa",也就是“中国”的gbk编码,用utf-8解析时就会不认识0xd6,导致编码错误。

文件编码是str类型的真正的编码格式,而python是用声明的编码来解码str类型的,所以导致了错误。

写文件相关编码

如果想将unicode字符串写入文件会发生什么情况呢?

1 #!/usr/bin/python
2 #coding:utf-8
3 import sys
4 s = u"中国"
5
6 f = open("test.txt", "w")
7 f.write(s)
8 f.close()


将以上代码以utf-8格式保存为test.py

在windows的console运行后出现



可见写文件时还是用ascii来编码s的, 该编码其实就是f.encoding,如果f.encoding为None则使用默认编码,即ascii。

同理print也是写文件,当执行print u"中国"时,采用的是sys.stdout.encoding来编码unicode字符串

python标准库中的函数返回的字符串的编码

python标准函数(非unicode版本)返回的字符串的编码是由操作系统设置决定的,在我的中文window7中返回的是GBK编码,英文linux中返回的是utf-8编码。该编码应该是和locale.getdefaultlocale()一致的。

string与unicode的转换

可以通过 unicode(string[, encoding, errors])来将string转为unicode字符串,string必须是str类型的字符串,encoding指明了string所用的编码,默认为ascii。所以,unicode("中国")会报错,因为ascii不能解码"中国",必须用encoding指定"中国"所用的编码。

1 #!/usr/bin/python
2 #coding:utf-8
3 import sys
4 us = u"中国"
5 s = "中国"
6 s1 = us + s


如上代码保存为utf-8格式后,运行会报错,原因是执行到第6行时会将s转为unicode,相当于调用了unicode(s),而不是unicode(s, "utf-8")。而u"中国"却是相当于调用了unicode(s, "utf-8"),有点奇怪。。。

raw string and unicode string

当字符串中有转义字符时,可以使用r前缀取消转义属性,此时字符串被称为raw string 如r"\t"相当于"\\t",需要注意的是r前缀和字符串之前不得有其他前缀,如ru"\t"这样的写法是错的,必须写成ur"\t"。

我们可以用u"\u0031"的方式来表示u"1",\u后面加一个code point表示一个unicode字符,如果写成ur"\u0031",则r前缀将不起作用,起作用的是u。写成r"\u0031"则会起到raw string的作用。

读文件

用python读文本文件时,会将文本文件的字节依次读出来。将此字节流输出到console时有可能产生乱码,原因是console用来解析该字节流的编码与该字节流真正的编码不兼容。

比如将一个utf-8格式的文本文件中字节流输出到windows的console就有可能产生乱码,因为中文版win7的console的默认代码页是cp936,也就是GBK编码,用GBK编码解析utf-8格式的编码当然有可能出错啦。但是GBK是和ASCII兼容的,而且utf-8也是和ASCII字符兼容的。如果utf-8字节流中只有ascii字符,此时输出到console便不会有乱码了。如果utf-8字节流中有含有中文,则用gbk解析的时候就会解析成乱码。

xml为了解决文本文件的编码问题,便在文件头部就指明了该文件所用的编码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: