wal*_*rus 17 python windows encoding utf-8 python-3.x
我正在使用Python 3(最近从Python 2切换).我的代码通常在Linux上运行,但有时(不常见)在Windows上运行.根据Python 3文档open(),locale.getpreferredencoding()如果encoding未提供arg,则文本文件的默认编码来自.我希望这个默认值适用于我utf-8的项目,无论它运行的是什么操作系统(目前,它始终是Linux的UTF-8,但不适用于Windows).该项目有很多次调用open(),我不想添加encoding='utf-8'到所有这些调用.因此,我想在Windows中更改区域设置的首选编码,就像Python 3看到的那样.
我发现了之前的问题" 更改"区域设置首选编码" ",它有一个已接受的答案,所以我觉得我很高兴.但不幸的是,该答案中的建议命令及其第一条评论都不适用于Windows.具体而言,公认的答案和它的第一个意见建议运行chcp 65001和set 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()
Run Code Online (Sandbox Code Playgroud)
请注意,即使在两个建议的命令之后,我打开的文件的编码仍然cp1252是预期的utf-8.
axi*_*xil 13
从python3.5.1开始,这个hack看起来像这样:
import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])
Run Code Online (Sandbox Code Playgroud)
此后打开的所有文件将采用默认编码utf8.
我知道这是一个真正的解决方法,但是您可以locale.getpreferredencoding()像这样重新定义功能:
import locale
def getpreferredencoding(do_setlocale = True):
return "utf-8"
locale.getpreferredencoding = getpreferredencoding
Run Code Online (Sandbox Code Playgroud)
如果您尽早运行此命令,则所有打开的文件(至少在Win XP计算机上测试时)是在utf-8中打开的,因为这会覆盖模块方法,因此将适用于所有平台。
如果您愿意,可以在 Windows 中将区域设置全局设置为 UTF-8,如下所示:
Control panel-> Clock and Region-> Region-> Administrative-> Change system locale-> 检查Beta: Use Unicode UTF-8 ...
之后,重新启动,我确认locale.getpreferredencoding()返回'cp65001'(=UTF-8) 并且其功能类似于open默认的 UTF-8。
| 归档时间: |
|
| 查看次数: |
7470 次 |
| 最近记录: |