python笔记:字符编码错误处理
- 2019 年 11 月 21 日
- 筆記
泪奔
'ascii' codec can't encode character
duang,duang,duang。 曾几何时,这句话困扰我好多年。。 今天终于弄清了出现这句话的原因。
背景
有了不同语言就有不同的编码,伴随着各种稀奇古怪的字符,字符编码
一直是程序员心中永远的痛。。 为了在不同的编码中切换,在python中,表达字符串是有两种类型的:
unicode str
没错,就是这么任性。
他们之间存在下面的关系:
unicode ---encode---> str str ---decode---> unicode
unicode是python的内置编码,以它为中间跳板,可以把字符串在不同的编码中转换。 然而,这两种类型,直接相加会发生戏剧化的隐式转换。而这个转换,与你的系统编码有关!
如果你的机器是ascii
的编码(很遗憾,米国的大部分机器还就是这个编码),那么,在 uni_str + xcode_str的时候,uni_str会自动进行encode("ascii")
,如果此时uni_str中有中文的话,那就要挂挂了。
解决
别让它们不同类型相加不就行了。 方法一,把unicode转成正确编码的str:
filename = u"大猪.txt" #显示成什么取决于你的机器 result = filename.encode("utf-8") + "haha"
方法二,将str转成unicode:
filename = u"大猪.txt" #显示成什么取决于你的机器 result = filename + "haha你".decode('utf-8') print(result.encode("utf-8"))
注意,Print函数如果打印的是系统不认识的编码,还是要挂的哦。所以最后的.encode("utf-8")
必不可少,真是一步一坑啊。 就这样,解决了。 就酱,解决了。
识别未知文字
有时候,我们需要对网络上的乱七八糟的东西进行编码。这才是神坑。网页上如果有爬虫得来的内容,很可能是一个大大的乱码。 比如,在数据库中,有一行这样的数据u'xd7xeeŒxc5xb5xc4xcfxc2xc2'
,如何把它正常的显示出来需要做一些判定了。 用下面的函数可以比较好的处理已经入库的各种编码。
# coding:utf-8 text0 = u'xd7xeeŒxc5xb5xc4xcfxc2xc2xa5xb7xbdxcaxbd' text1 = u'xd7xeeŒxc5xb5xc4xcfxc2xc2' text2 = u'u7528u4e86u4e00u4e0bu5348u7ec8u4e8eu628au6c34u94f2u5149u4e86' def utf8_or_empty(text): if repr(text).startswith('u'): # 说明是utf-8字符串 attr = repr(text)[2:4] if attr == u'\u': # unicode字符串,直接返回 return text elif attr == u'\x': # utf-8 or gbk的字符串 try: temp_text = text.encode('raw_unicode_escape').decode('utf-8') except UnicodeDecodeError: temp_text = u"" if not temp_text: try: temp_text = text.encode('raw_unicode_escape').decode('gbk') except: temp_text = u"" return temp_text print type(utf8_or_empty(text0)) print utf8_or_empty(text0) print type(utf8_or_empty(text1)) print utf8_or_empty(text1) print type(utf8_or_empty(text2)) print utf8_or_empty(text2)
参考资料:http://pydoc.net/Python/CodeConvert/2.0.0/CodeConvert/