python 2.x 编码问题

最近所做的项目中涉及到很多用Python处理文档的问题,被其中的编码问题弄得十分头大。个人做了一些研究,在此记录一下。

关于各种字符编码在此不赘述,可以参看廖雪峰:字符串与编码

1、中文字符串报错

在python中使用中文字符串,会出现一下错误:
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. str = "哈哈"  
  2. print str  
  3. #运行结果报错:SyntaxError: Non-ASCII character '\xe5'  
 出现这个问题的原因是因为,Python 2.x的默认编码格式是ASCII,就是说,在没有指定Python源码编码格式的情况下,源码中的所有字符都会被默认为ASCII码。因此,字符串“哈哈”超出了ASCII码的表示范围,就会出现这个问题。
解决这个问题也很简单,在文件开头# -*- coding: UTF-8 -*-,就能够将该文件的编码方式改成UTF-8编码
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # -*- coding: UTF-8 -*-  
  2. str = "哈哈"  
  3. print str#哈哈  
这里所说的源码编码方式是指对py文件的编码,如果在命令行中运行则不会有这个问题


2、str和Unicode

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。因此字符串在python内部都是unicode,而我们使用的str,其实可以说是unicode进过字符编码后的一个字符数组。
关于字符串的编码和解码如下:
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # -*- coding: utf-8 -*-  
  2. str = u'哈'  
  3. print str #输出str的unicode码显示哈  
  4. print repr(str) #输出str的unicode码:u'\u54c8'  
  5.   
  6. u = str.encode('utf8')#将str由unicode编码成utf8  
  7. print u #输出str的utf8码显示:哈  
  8. print repr(u) #输出str的utf8编码:'\xe5\x93\x88'  
  9.   
  10. #将str用其他编码方式进行编码  
  11. s = u.decode('utf8').encode('gbk')  
  12. print s #输出str的gbk码显示:��  
  13. print repr(s) #输出str的gbk编码:'\xb9\xfe'  
以上代码展示了一个字符串用常用编码方式进行编码解码的过程

通过上述代码我们还能发现一个问题:print str和print repr(str)的内容是不一样的。其中repr()代表将str转化为一个字符串。前者输出的是str在当前环境中所展示出来的内容,而后者则显示了str的编码内容。这样看或许不明显,我们在命令行模式下运行试试:

很显然,print将编码内容作了一次转换,将其编译成当前环境的编码方式
然后print也不是对任何对象都有这个功能的,看下面这个例子:

显然,在面对list对象时,print就失去了这个功能,那么想要输出list中具体的内容该怎么办呢?这里提供一种方法:
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. list = ['昨天','今天','明天']  
  2. print list #['\xe6\x98\xa8\xe5\xa4\xa9', '\xe4\xbb\x8a\xe5\xa4\xa9', '\xe6\x98\x8e\xe5\xa4\xa9']  
  3. print '[' + ','.join("'""'" + x +"'" for x in list) + ']' #['昨天','今天','明天']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章