6

Here are 2 code samples, Python3 : the first one writes two files with latin1 encoding :

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)

The second one reads the same files with the same encoding :

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()

Now, printing s1 and s2 I get

On écrit ça dans un fichier.

instead of the initial "On écrit ça dans un fichier."

What is wrong ? I also tried with io.open but I miss something. The funny part is that I had no such problem with Python2.7 and its str.decode method which is now gone...

Could someone help me ?

4

1 回答 1

6

您的数据以 UTF-8 格式写出:

>>> 'On écrit ça dans un fichier.'.encode('utf8').decode('latin1')
'On écrit ça dans un fichier.'

这意味着您没有写出 Latin-1 数据,或者您的源代码保存为 UTF-8 但您声明了您的脚本(使用PEP 263 兼容的标头改为 Latin-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 字符并改用转义码;要么使用\uxxxxunicode 代码点:

s = 'On \u00e9crit \u007aa dans un fichier.'

\xaa低于 256 的代码点的一字节转义码:

s = 'On \xe9crit \x7aa dans un fichier.'
于 2013-07-22T14:41:14.737 回答