繁体   English   中英

为什么此程序(开放式编码utf-8 utf-8-sig)在某些情况下会失败,而不是在其他情况下会失败

[英]Why this program ( open encodings utf-8 utf-8-sig ) fails in some context, not in other context

为什么使用此程序:

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ść sztuk\n")

with open("example.txt", "r", errors="strict") as rf:
    lr = rf.readline()
    print("lr=", lr)

在某些情况下运行正常,而在其他情况下运行失败。

示例OK:

$ 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

上下文是; chroot中的chroot中的Ubuntu 19.04,Ubuntu 18.04,Debian 9,chroot以外的LANG是“ en_US.UTF-8”或“ fr_FR.UTF-8”,对成功或失败均没有影响

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

如果您需要某些环境变量的值,我可以给出。

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

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

但是,如果在对open()的调用中省略了encoding=...参数,则使用locale.getdpreferredencoding()locale.getdpreferredencoding() ,将使用locale.getdpreferredencoding() 同样适用于sys.stdinsys.stdoutprint() !), sys.stderr 此默认值取决于启动Python解释器的环境。 如何确定此值的详细信息在平台之间有所不同,但是通常可以通过设置PYTHONIOENCODING env变量来实现所需的行为。 从Python 3.7开始,您可以使用-X utf8启动Python以启用UTF-8模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM