【问题】
在写Python过程中,需要实现对应的字符串替换,将gVal[‘newPostPatStr’]的值:
本博客已搬家至:<p><a href="https://www.crifan.org/category/work_and_job/" target="_blank">在路上 – On the way:技术</a></p> 当前帖子的新地址是:<p><a href="https://www.crifan.org/${postYear}/${postMonth}/${postDay}/${postTitleName}" target="_blank">${titleName}</a></p> 如果帖子地址有变化而导致无法访问新帖子,请在网站右上角的搜索框中搜索帖子标题,即可找到最新帖子。 ————————————— ${originBlogContent} |
中的${titleName}替换为一个帖子的真正的标题。
但是在用
gVal[‘newPostPatStr’].replace("${titleName}", postDict[‘titleName’]);
的时候,出现上述错误:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 0: ordinal not in range(128)
【解决过程】
1.很久之前,在用python的时候,就出现过很多次的某str类型变量,去调用replace,结果不起作用。
此处则是直接错误,无法运行。
2..注意到错误提示中的“ordinal not in range(128)”,意思是,字符不在128范围内,即说明不是普通的ASCII字符,超出处理能力了。所以感觉是str类型的变量,无法处理超过ASCII之外的字符。所以想到去将对应原始字符转换为unicode:
gVal['newPostPatStr'] = unicode(gVal['newPostPatStr']);
然后再去调用上面的replace,结果此句执行结果,也出现和上面同样的错误,无法转换为unicode。
3.尝试了去用re.compile,然后xxx.sub的形式,也是同样错误,无法替换字符串。
4.后来尝试了:
compiled = re.compile(r"${titleName}"); replacedStr = compiled.sub(postDict['titleName'], gVal['newPostPatStr']);
以及
compiled = re.compile(r"\$\{titleName\}"); replacedStr = compiled.sub(postDict['titleName'], gVal['newPostPatStr']);
都还是出现同样错误。
5.最后是通过,在最开始的时候,得到gVal[‘newPostPatStr’]的值之后,
调用unicode时候指定对应的编码:
gVal['newPostPatStr'] = unicode(gVal['newPostPatStr'], "utf-8");
然后就可以强制转换为unicode了,然后之后的字符串处理,就都是可以正常的了。
【总结】
此处是最开始获得某字符串变量,没有通过指定编码为utf-8转换为unicode,然后接下来的操作,比如replace替换,就都无法处理包含了utf-8的,超出了128 range的字符,才会报UnicodeDecodeError错的。
所以,以后遇到UnicodeDecodeError方面的错误,那就先去看看,是不是由于没有指定合适的编码。如果指定了对应的编码后,字符串的一切操作(replace, re.sub等),一般来说,就都可以正常操作了。
不过,总的来说,还是要对字符编码很熟悉的,否则,Python中的字符编码方面的问题,真的会让人很头大,虽然python本身对字符编码做的已经不错了。。。
【后记】
关于Python中编解码方面的常见错误,已整理至:Python中的 UnicodeEncodeError
转载请注明:在路上 » 【已解决】Python字符串处理出现错误:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 0: ordinal not in range(128)