在Windows中更改Python 3中的“区域首选编码”

我正在使用Python 3(最近从Python 2切换)。 我的代码通常运行在Linux上,但也有时(不经常)在Windows上运行。 根据open() Python 3文档,如果没有提供encoding参数,文本文件的缺省编码是从locale.getpreferredencoding()的。 我希望这个默认值是UTF-8,无论它运行在哪个操作系统上(目前,它总是用于Linux的UTF-8,而不是用于Windows)。 该项目有很多open()呼吁,我不想添加encoding='utf-8'到他们所有人。 因此,我想在Python 3中看到它在Windows中更改语言环境的首选编码。

我发现了一个前面的问题“ 改变”首选编码“ ”,这个编码有一个可以接受的答案,所以我觉得我很好走。 但不幸的是,这个答案中的build议命令和它的第一条评论都不适用于Windows。 具体来说,接受的答案和其第一个意见build议运行chcp 65001set PYTHONIOENCODING=UTF-8 ,我已经尝试了两个。 请从我的cmd窗口看下面的脚本:

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

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

Solutions Collecting From Web of "在Windows中更改Python 3中的“区域首选编码”"

我知道它是一个真正的hacky解决方法,但你可以像这样重新定义locale.getpreferredencoding()函数:

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

如果你早点运行,所有在win xp机器上测试过的文件都会在utf-8中打开,并且覆盖模块方法,这将适用于所有的平台。

从python3.5.1开始,这个hack看起来像这样:

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

之后打开的所有文件将默认编码为utf8