【发布时间】:2021-07-30 18:28:22
【问题描述】:
每天fetch_poem() 检索一首诗。每周一,诗歌会在周二以英文回归;丹麦语,周三;挪威语……等等。
我每天将这些诗写到位于path 的文件中:
my_poem = fetch_poem()
with open(path, "w") as f: #
f.write(my_poem)
我的问题是,编码可以取决于字符串中的字母/字符/语言吗?我从来没有明确地将编码传递给open()。
Documentation 说:
encoding 是用于对文件进行解码或编码的编码名称。这应该只在文本模式下使用。默认编码取决于平台(无论
locale.getpreferredencoding()返回什么),但可以使用 Python 支持的任何文本编码。
我的locale.getpreferredencoding
我使用的是丹麦语区域设置的 Windows 服务器。运行 getpreferredencoding() 会得到 cp1252:
$ python -c "import locale; print(locale.getpreferredencoding(do_setlocale=True))"
cp1252
这是否意味着 cp1252 用于对我的所有文件进行编码?
【问题讨论】:
-
可能,并且仅在 Windows 中(以及某些 Windows 版本和某些位置),以及 Python 的实际版本。所以:在
open上明确编码:减少意外,它也可以作为文档。 [顺便说一句:更喜欢 UTF-8] -
一首非 UTF-8 字符的诗歌被提取的那一天,程序将出错。我可以将文件写入包装在
try-except UnicodeDecodeError中并尝试 fetch_poem() 直到获取符合 UTF-8 的文件。这不是一个非常优雅的解决方案。一般来说,我同意,所有情况下“只使用 X”的解决方案都是黄金。 -
UTF-8 编码 Unicode,因此它应该包含所有字符。 Windows 不支持 Unicode 以外的字符,Python 字符串应该已经是 unicode。 [注意 ASCII 和 Latin1 以及所有 Windows 代码页都是 Unicode 的子集)——否则您将写入二进制文件(带有
b标志) -
这取决于你以后想对这些诗做什么。如果您使用需要特定编码的应用程序处理它们,请使用该编码。顺便提一句。对于您的问题,是的,在您的系统上,cp1252 将用于所有文件。