其他分享
首页 > 其他分享> > py 编码

py 编码

作者:互联网

5.编码

这里主要针对 py2 来说。

关于编码的问题我很早就注意到了,当时处理一段文本,发现这里面有很多这样的字符:

\\xe5\\xb0\\x8f\\xe7\\xb1\\xb3\\xe6\\x89\\x8b\\xe6\\x9c\\xba \x91\xb8

这是什么莫名其妙的东西,当时了解到这是非英文文本被 ascii (py2 默认编码) 编码处理后的结果,没错就是乱码,但是没有深入了解它,今天终于知道这是 十六进制字节码,这种字节码用 \ 进行转义,但是从 txt 读取之后就自动变成了 \\ 取消转义,系统就没法识别了。要感谢这个博客:https://blog.csdn.net/tiwoo/article/details/50334515

In [76]: "\\x41\\x42\\x43\\xe4\\xb8\\xad"
Out[76]: '\\x41\\x42\\x43\\xe4\\xb8\\xad'
In [57]: len("\\x41\\x42\\x43\\xe4\\xb8\\xad")
Out[57]: 24

In [77]: "\x41\x42\x43\xe4\xb8\xad"
Out[77]: 'ABC\xe4\xb8\xad'
In [78]: len("\x41\x42\x43\xe4\xb8\xad")
Out[78]: 6

今天把一些py2的代码转换成py3代码(使用 2to3 ),又遇到了这个问题:

# py2 情况下
print 'espa\xc3\xb1a'
out: españa

但是有两个问题,第一放到txt中再读取就不对了,第二是py3运行这段代码会出错。

我从python2生成的 txt 文件中读取的全是乱码,解决方法如下

# b是从txt中读取的字符串,包含很多乱码。py2环境
with open('file.txt', 'w') as f:
    print len(b.split())
    f.write(b.decode('string_escape').decode("utf-8", errors='replace').encode("utf-8"))

先使用 string_escape 解码,再进行utf-8解码,错误使用 ? 代替,最后编码成 utf-8.

事实证明,尽快换成py3才是正解,默认就是 utf-8 编码。
参考: https://stackoverflow.com/questions/491921/unicode-utf-8-reading-and-writing-to-files-in-python

标签:编码,utf,xb8,py,xe4,txt,xad
来源: https://blog.csdn.net/qq_44761480/article/details/113785089