python not in range_【已解决】Python字符串处理出现错误:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in...

【问题】

在写Python过程中,需要实现对应的字符串替换,将gVal[‘newPostPatStr’]的值:本博客已搬家至:

在路上 – On the way:技术

当前帖子的新地址是:

${titleName}

如果帖子地址有变化而导致无法访问新帖子,请在网站右上角的搜索框中搜索帖子标题,即可找到最新帖子。

—————————————

${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本身对字符编码做的已经不错了。。。

【后记】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值