本文实例讲述了python实现unicode转中文及转换默认编码的方法。分享给大家供大家参考,具体如下:
一、在爬虫抓取网页信息时常需要将类似"/u4eba/u751f/u82e6/u77ed/uff0cpy/u662f/u5cb8"转换为中文,实际上这是unicode的中文编码。可用以下方法转换:
1、
>>> s = u'/u4eba/u751f/u82e6/u77ed/uff0cpy/u662f/u5cb8'>>> print s人生苦短,py是岸
2、
>>> s = r'/u4eba/u751f/u82e6/u77ed/uff0cpy/u662f/u5cb8'>>> s = s.decode('unicode_escape')>>> print s人生苦短,py是岸
二、另外,在python2的字符编码问题时常会遇到“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)”的编码错误。
而用以下方法通常可以解决:
import sysreload(sys)sys.setdefaultencoding('utf-8')
此方法是将Python2的默认编码ASCII改为 utf-8。但此方法不是一劳永逸的,可能会使一些代码的行为变得怪异。
关于sys.setdefaultencoding('utf-8')的补充:
sys.setdefaultencoding('utf-8')
会导致的两个大问题
简单来说这么做将会使得一些代码行为变得怪异,而这怪异还不好修复,以一个不可见的 bug 存在着。下面我们举两个例子。
1. 编码错误
import chardetdef print_string(string): try: print(u"%s" % string) except UnicodeError: print u"%s" % unicode(byte_string, encoding=chardet.detect(string)['encoding'])print_string(u"þ".encode("latin-1"))import sysreload(sys)sys.setdefaultencoding('utf-8')print(key_in_dict('þ'))
输出:
$~ þ$~ þ
在上面的代码中,默认的 ascii 编码无法解码,þ latin-1 编码 hex 表示是 c3 be ,显然是超出了只有128个字符的 ascii 码集的,引发 UnicodeError 异常,进入异常处理。异常处理则会根据编码探测,用最可能的编码来解码,会比较靠谱地输出 þ 。
而一旦我们将 defaultencoding 设置为 utf-8,因为 utf-8 的字符范围是完全覆盖 latin-1,因此,会直接使用 utf-8 进行解码。c3 be 在 utf-8 中,是 þ。于是我们打印出了完全不同的字符。
可能你们会说我们不会写这样的代码。如果我们写了也会做修正。但如果是第三方库这么写了呢?项目依赖的第三方库就这么 bug 了。如果你不依赖第三方库,那么下面这个 bug,还是逃不过。
2. dictionray 行为异常
假设我们要从一个 dictionary 里查找一个 key 是否存在,通常来说,有两种可行方法。
#-*- coding: utf-8 -*-d = {1:2, '1':'2', '你好': 'hello'}def key_in_dict(key) if key in d: return True return Falsedef key_found_in_dict(key): for _key in d: if _key == key: return True return False
新闻热点
疑难解答