Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3'的默认编码;s open()在Windows下。sys.getdefaultencoding()设置不受尊重_Python_Python 3.x_Encoding_Utf 8 - Fatal编程技术网

Python 3'的默认编码;s open()在Windows下。sys.getdefaultencoding()设置不受尊重

Python 3'的默认编码;s open()在Windows下。sys.getdefaultencoding()设置不受尊重,python,python-3.x,encoding,utf-8,Python,Python 3.x,Encoding,Utf 8,我已经为这个问题发火好几个小时了 我想使用django的makemessages命令生成一个消息文件,它在Linux环境中运行良好,而Linux环境实际上以一种合理的方式处理语言环境设置。然而,当我在Windows下尝试同样的事情时,每次python试图打开一个文件时,它都假定它是用cp932(SHIFT-JIS)编码的,这会造成各种各样的破坏 手动将encoding='utf-8'添加到每个open调用中是可行的,但这并不是解决问题的好方法。有没有办法强制打开以使用特定的默认编码 sys.g

我已经为这个问题发火好几个小时了

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

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

  • sys.getdefaultencoding()
    返回“utf-8”,因为某些神秘的原因,此设置不受尊重
  • Python编码和Python编码都设置为“utf-8”
  • 我的代码页设置为
    cp65001
这是我的python版本字符串:

win32上的Python 3.3.2(v3.3.2:d047928ae3f6,2013年5月16日,00:06:53)[MSC v.1600 64位(AMD64)]

编辑:我注意到,
locale.getPreferredEncode()
返回
cp932
,所以我想找到默认为
utf-8
的Windows区域设置就可以了。这样的事情真的存在吗?

试试这个

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

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