在Windows中更改Python3中的“区域设置首选编码”

2024-09-27 21:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python3(最近从Python2切换过来)。我的代码通常在Linux上运行,但有时(不经常)在Windows上运行。根据Python 3关于^{}的文档,如果不提供encoding参数,则文本文件的默认编码来自locale.getpreferredencoding()。对于我的一个项目,我希望这个默认值是utf-8,不管它运行在什么操作系统上(目前,它总是在Linux上运行UTF-8,而不是在Windows上)。这个项目有许多对open()的调用,我不想将encoding='utf-8'添加到所有这些调用中。因此,正如Python 3所看到的,我想在Windows中更改区域设置的首选编码。

我发现了一个问题 “Changing the "locale preferred encoding"”,这是一个公认的答案,所以我认为我很好去。但不幸的是,这个答案中建议的命令和它的第一条评论在Windows中都不起作用。具体来说,这个公认的答案和它的第一条注释建议运行chcp 65001set PYTHONIOENCODING=UTF-8,我已经尝试了这两种方法。请从我的命令窗口查看下面的文字记录:

> py -i
Python 3.4.3 ...
>>> f = open('foo.txt', 'w')
>>> f.encoding
'cp1252'
>>> exit()

> chcp 65001
Active code page: 65001

> py -i
Python 3.4.3 ...
>>> f = open('foo.txt', 'w')
>>> f.encoding
'cp1252'
>>> exit()

> set PYTHONIOENCODING=UTF-8

> py -i
Python 3.4.3 ...
>>> f = open('foo.txt', 'w')
>>> f.encoding
'cp1252'
>>> exit()

注意,即使在两个建议的命令之后,我打开的文件的编码仍然是cp1252,而不是预期的utf-8


Tags: 答案py命令txt编码foolinuxwindows
2条回答

从python3.5.1开始,这个黑客程序如下所示:

import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])

此后打开的所有文件将假定默认编码为utf8

我知道这是一个非常复杂的解决方法,但是您可以像这样重新定义locale.getpreferredencoding()函数:

import locale
def getpreferredencoding(do_setlocale = True):
    return "utf-8"
locale.getpreferredencoding = getpreferredencoding

如果您在早期运行这个程序,那么在utf-8中打开之后打开的所有文件(至少在win-xp机器上的测试中是这样)都会覆盖模块方法,这将应用于所有平台。

相关问题 更多 >

    热门问题