以下是2个代码示例,Python3:第一个使用latin1编码写入两个文件:
s='On écrit ça dans un fichier.'
with open('spam1.txt', 'w',encoding='ISO-8859-1') as f:
print(s, file=f)
with open('spam2.txt', 'w',encoding='ISO-8859-1') as f:
f.write(s)
第二个使用相同的编码读取相同的文件:
with open('spam1.txt', 'r',encoding='ISO-8859-1') as f:
s1=f.read()
with open('spam2.txt', 'r',encoding='ISO-8859-1') as f:
s2=f.read()
现在,我打印s1和s2
On écrit ça dans un fichier.
而不是最初的“Onécritçadansun fichier。”
有什么问题?我也尝试过io.open,但我想念一些东西。有趣的是,我对Python2.7及其str.decode方法没有这样的问题,现在它已经消失......
有人可以帮助我吗?
答案 0 :(得分:4)
您的数据是以UTF-8编写的:
>>> 'On écrit ça dans un fichier.'.encode('utf8').decode('latin1')
'On écrit ça dans un fichier.'
这意味着您没有写出Latin-1数据,或者您的源代码保存为UTF-8,但您声明了您的脚本(使用PEP 263-compliant header代替拉丁语-1。
如果您使用如下标题保存Python脚本:
# -*- coding: latin-1 -*-
但您的文本编辑器使用UTF-8编码保存文件,然后是字符串文字:
s='On écrit ça dans un fichier.'
同样,也会被Python误解。将生成的unicode值保存为Latin-1,然后再将其读取为Latin-1将保留错误。
要进行调试,请仔细查看第一个脚本中的print(s.encode('unicode_escape'))
。如果它看起来像:
b'On \\xc3\\xa9crit \\xc3\\xa7a dans un fichier.'
然后您的源代码编码和PEP-263标头在如何解释源代码方面存在分歧。如果您的源代码被正确解码,则正确的输出是:
b'On \\xe9crit \\xe7a dans un fichier.'
如果Spyder顽固地忽略PEP-263标头并将您的源读取为Latin-1 而不管,请避免使用非ASCII字符并改为使用转义码;使用\uxxxx
unicode代码点:
s = 'On \u00e9crit \u007aa dans un fichier.'
代码点低于256的或\xaa
单字节转义码:
s = 'On \xe9crit \x7aa dans un fichier.'