通过UnicodeDecodeError简单讨论python中的编码问题

Python3 环境下可以运行以下代码实现文本替换:

 

with open(src0,"r") as f1:

    content = f1.read() 

 

t = content.replace(r'XXX',r'YYY')

 

with open(src0,"w") as f2:

    f2.write(t)

 

但上述代码在Python2环境下运行会产生以下错误:

Exception has occurred: UnicodeDecodeError

'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

 

该错误产生的原因是:python2 将包含非ASCII的字符串转换为Unicode字符串的过程中没有预先指明原始字符串的编码方式。

 

ASCII,Unicode和UTF-8的区别

 

ASCII是一套对于英文字母和阿拉伯数字的字符编码表,总共规定了128个字符,可以将它们表示为00000000到01111111的128种二进制编码。

 

Unicode 则是一套对应所有符号的编码表。但对于unicode来说,表示不同符号的时候所需要的字节数不一样,这导致了它有多种不同的储存方式。

 

UTF-8就是当今最为普遍的一种Unicode 实现方式。

 

编码:字符串(str)转换(通过UTF-8)为二进制串(unicode)的过程;解码反之。

 

解决方法:

import io

 

with io.open(src0, "r", encoding="utf-8") as f1:

    content = f1.read() 

 

t = content.replace(r'XXX',r'YYY')

 

with io.open(src0,"w", encoding="utf-8") as f2:

    f2.write(t)

或者

import io

 

with io.open(src0, "r") as f1:

    content = f1.read() 

 

t = content.replace(u'XXX',u'YYY') 

#u是unicode的编码,r是原始字符,python2中默认编码方式为ASCII,python3默认unicode

 

with io.open(src0,"w") as f2:

    f2.write(t)

 

P.S.

以上的content均为bytes类型需要经过.decode()才能转成str型

 

posted @ 2021-03-26 14:21  henkenen  阅读(152)  评论(0编辑  收藏  举报