UnicodeDecodeError报错解决:含特殊字符字符串处理及find方法使用问题
解决Python 2中UnicodeDecodeError并正确处理字符串查找问题
这个坑我在Python 2里踩过好多次!你遇到的UnicodeDecodeError本质是因为Python 2对字符串的处理机制:str类型其实是字节串,而unicode()函数默认会用ASCII编码去解码字节串——但你的字符串里有à(对应的字节是\xe0),ASCII编码根本不包含这个字符,所以直接解码就炸了。
下面给你一步步的解决方案:
1. 明确编码,正确解码字节串
首先你得确定原字符串temp的编码格式。从报错里的\xe0来看,这个字节对应的是à的**Latin-1(ISO-8859-1)**编码(如果是UTF-8的话,à应该是\xc3\xa0两个字节)。所以你需要在解码时指定编码:
temp = "à la Carte" # 指定Latin-1编码解码成unicode类型 utemp = unicode(temp, encoding='latin-1') # 如果你确认原字符串是UTF-8编码,就改成encoding='utf-8'
2. 正常使用find方法检查子串
转成unicode类型后,就可以放心用find方法了。注意子串最好也用unicode类型(加u前缀),避免混合类型带来的问题:
# 检查是否包含"Carte"子串 if utemp.find(u"Carte") != -1: print("字符串包含目标子串") # 检查带特殊字符的子串也没问题 if utemp.find(u"à la") != -1: print("字符串包含'à la'")
3. 兜底方案(不推荐,仅应急)
如果你暂时不确定原字符串的编码,或者想跳过编码错误,可以给unicode()加errors参数处理异常,但这可能会丢失或替换字符,尽量不用:
# 用?替换无法解码的字符 utemp = unicode(temp, encoding='latin-1', errors='replace') # 直接忽略无法解码的字符 utemp = unicode(temp, encoding='latin-1', errors='ignore')
额外建议
在Python 2里处理文本时,最好全程用unicode类型:
- 代码开头指定文件编码(比如你的脚本里写的字符串字面量是Latin-1的话):
# -*- coding: latin-1 -*-
- 从外部读取文本(文件、网络)时,先按对应编码解码成
unicode再处理。
内容的提问来源于stack exchange,提问作者Jacek Sierajewski
相关产品推荐
相关产品推荐

