【问题标题】:Default encoding of Python 3's open() under Windows. sys.getdefaultencoding() setting not respectedWindows 下 Python 3 的 open() 的默认编码。 sys.getdefaultencoding() 设置不被尊重
【发布时间】:2015-02-11 16:13:45
【问题描述】:

我已经为这个问题烦恼了几个小时了。

我有一个想要使用 django 的 makemessages 命令生成的消息文件,该命令在 Linux 环境中运行良好,它实际上以一种理智的方式处理语言环境设置。但是,当我在 Windows 下尝试相同的操作时,每次 python 尝试打开文件时,它都假定它是用cp932 (SHIFT-JIS) 编码的,这会造成各种破坏。

在每个open 调用中手动添加encoding='utf-8' 是可行的,但这并不是解决问题的好方法。有没有办法强制open 使用特定的默认编码?

  • sys.getdefaultencoding() 返回 'utf-8',由于某种神秘的原因,此设置不受尊重
  • PYTHONIOENCODING 和 PYTHONENCODING 都设置为“utf-8”
  • 我的代码页设置为cp65001

这是我的python版本字符串:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32

编辑:我注意到locale.getpreferredencoding() 返回cp932,所以我想找到一个默认为utf-8 的Windows 语言环境就可以了。这样的事情还存在吗?

【问题讨论】:

  • 如果实在找不到解决办法,可能是Windows 3.3 的bug。另一方面,在调用open() 时明确编码并不是一个坏主意。
  • 好吧,我知道明确编码从来都不是一个坏主意,问题是在 Django 实用程序的相关部分中替换所有对 open 的调用并不是真正可行的。我发现locale.getpreferredencoding() 确实返回cp932,所以这可能是问题所在。是否有任何 Windows 语言环境将此设置为 utf-8
  • 可能,我对此不太熟悉。但它返回 cp932 的事实可能确实表明它是您机器(或一般 Windows)上的语言环境设置干扰了这里。
  • 我应该补充一点,这个问题(原则上)可以通过覆盖 locale.getpreferredencoding 来解决(我暂时这样做是为了解决这个问题),但我真的希望有另一种方法来解决这个问题。
  • 您可能会建议 Django 开发人员让 you 而不是 Microsoft,指定 you 希望 Django 在其内部打开时使用的编码来电。同时,至少升级到 3.3.5 的错误修复;可能有一些与 unicode 有关。

标签: python python-3.x encoding utf-8


【解决方案1】:

试试这个

import locale
locale.setlocale(locale.LC_ALL, 'en_US.utf-8')

【讨论】:

  • 这对我不起作用。
猜你喜欢
  • 2016-07-18
  • 2010-10-02
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2019-04-01
  • 2014-09-13
相关资源
最近更新 更多