最新消息:20210917 已从crifan.com换到crifan.org

【已解决】Python字符串处理出现错误:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 0: ordinal not in range(128)

Python crifan 12889浏览 0评论

【问题】

在写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)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (3)

  1. 又跑到你这个垃圾站,~~~ 一句话说清楚的东西 你要写100篇文章来绕
    兔牙7年前 (2017-04-26)回复
  2. 我对python的了解也不是很深,我是在连接字符串的时候遇到了问题,我从你的文章得到灵感,help了下str(),str对象里面的decode方法不是正好可以用吗?我不太清楚用unicode的好处,不过我觉得使用str应该更合适一点 # -*- coding:gbk -*- import sys strout = "测试字符串" + sys.getdefaultencoding() # error ..... strout = str("测试字符串").decode("gbk") + sys.getdefaultencoding() # correct ! 测试字符串ascii
    dave10年前 (2014-03-18)回复
102 queries in 0.195 seconds, using 23.44MB memory