首页 > 编程 > Python > 正文

python实现unicode转中文及转换默认编码的方法

2020-02-23 04:37:06
字体:
来源:转载
供稿:网友

本文实例讲述了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            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表