为什么这个程序(开放编码utf-8 utf-8-sig)在某些上下文中失败,而不是在其他上下文中失败



为什么,用这个程序:

import sys
print("sys.getdefaultencoding()='%s'" % (sys.getdefaultencoding(), ))
with open("example.txt", "w", encoding="utf-8-sig", errors="replace") as f:
f.write("test;Ilość sztukn")
with open("example.txt", "r", errors="strict") as rf:
lr = rf.readline()
print("lr=", lr)

在某些上下文中运行正常,在其他上下文中运行失败。

示例确定:

$ python3 ./example.py 
sys.getdefaultencoding()='utf-8'
lr= test;Ilość sztuk

注意:

$ python3 --version
Python 3.6.8

示例 KO :

sys.getdefaultencoding()='utf-8'
Traceback (most recent call last):
File "./example.py", line 9, in <module>
lr = rf.readline()
File "/.../python/lib/python3.6/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)
$

注意:

$ python3 --version
Python 3.6.8

上下文是 ;Ubuntu 19.04,Ubuntu 18.04,Debian 9,在chroot中,在chroot之外,LAN是"en_US。UTF-8"或"fr_FR。UTF-8",对成功或失败没有影响

在所有情况下,Python都是使用相同的选项手动安装的。

如果你需要一些环境变量的值,我可以给它。

我搜索在所有情况下都具有完全相同的执行。

在Python 3中,有不同的编码默认值。 您找到的那个,sys.getdefaultencoding(),告诉您方法的默认值str.encode()bytes.decode()。 据我所知,它总是UTF-8,无论你使用什么Python构建或实现。

但是,如果在调用open()时省略encoding=...参数,则使用locale.getpreferredencoding();也用于sys.stdinsys.stdout(print()!(、sys.stderr。 此默认值的值取决于启动 Python 解释器的环境。 如何确定此值的详细信息因平台而异,但通常可以通过设置PYTHONIOENCODINGenv 变量来实现所需的行为。 从 Python 3.7 开始,您可以使用-X utf8启动 Python 以启用 UTF-8 模式。

相关内容

最新更新