python的编码问题

基本概念

  • str和unicode都是basestring的子类
  • 关系:
    str -> decode('the_coding_of_str') -> unicode
    unicode -> encode('the_coding_you_want') -> str
  • 区别:
>>> a='我'  # str
>>> b=u'我'  # unicode
>>> a
'\xce\xd2'
>>> b
u'\u6211'
  1. str是字节串,由unicode经过编码(encode)后的字节组成的
  2. unicode才是真正意义上的字符串,由字符组成

    • 思路:搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode//or//unicode.encode)
    • 简单原则:不要对str使用encode,不要对unicode使用decode (事实上可以对str进行encode的,具体见最后,为了保证简单,不建议)

简记

  • encode是编码,decode是解码
  • 编码:采用一定的编码格式将unicode字符转换成str字符的过程。即真实字符→二进制串(unicode→str)
  • 解码:二进制串→真实字符(str→unicode)

事例

  1. 比如读入一行中文代码,要写入另一个文件时,需要解码与编码的变换:
p = "我在博客园“
w.write(p.decode('utf-8').encode('utf-8') + '\n') 

解释:
汉字是已经经过编码的字符(只有unicode是原始字符串),所以如果想存入电脑系统不太容易直接识别,最保险的办法就是先解码成计算机都能够是别的unicode,再编码成utf-8的。

  1. 如果开头有coding:utf-8, 但是还是出现了编码问题,就可以再加上以下代码在开头即可:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
  1. 解码实例:
try:
    print "unicode('我'):", unicode('我')
except UnicodeDecodeError as e:
    # 错误信息
    # 解析器试图用ascii编码来解码我们传入的参数,原因就是解析器会先将参数用默认的编码格式(这里是utf-8)进行编码,然后传给unicode()函数,
    print e
  1. str本身是不能encode的,如果想要encode,先要转化成unicode。

    • 解释:
      str.encode()实际上就等价于str.decode(sys.defaultencoding).encode().而sys.defaultencoding一般是ascii,它是不能用来编码中文字符的。
  2. sd

发布了35 篇原创文章 · 获赞 16 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章