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

时间:2015-07-17 06:35:52

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

我正在使用Python 3(最近从Python 2切换)。我的代码通常在Linux上运行,但有时(不常见)在Windows上运行。根据{3}的Python 3文档,如果未提供locale.getpreferredencoding() arg,则文本文件的默认编码来自encoding。我希望这个默认值对于我的项目来说是utf-8,无论它运行的是什么操作系统(目前,它总是UTF-8用于Linux,但不用于Windows)。该项目有很多次调用open(),我不想将encoding='utf-8'添加到所有这些调用中。因此,我想在Windows中更改区域设置的首选编码,就像Python 3看到的那样。

我发现了上一个问题 “open()”,已经接受了答案,所以我觉得我很高兴。但遗憾的是,该答案及其第一条评论中的任何建议命令都不适用于Windows。具体来说,接受的答案及其第一条评论建议运行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()

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

4 个答案:

答案 0 :(得分:12)

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

appstore

此后打开的所有文件将默认编码为Uber

答案 1 :(得分:5)

我知道这是一个真正的hacky解决方法,但您可以像这样重新定义<InsertItemTemplate> <tr style="background-color:#D3D3D3"> <td valign="top"> <asp:Label runat="server" ID="FirstNameLabel" AssociatedControlID="FirstNameTextBox" Text="First Name"/> <asp:TextBox ID="FirstNameTextBox" runat="server" Text='<%#Bind("FirstName") %>' /><br /> <asp:Label runat="server" ID="LastNameLabel" AssociatedControlID="LastNameTextBox" Text="Last Name" /> <asp:TextBox ID="LastNameTextBox" runat="server" Text='<%#Bind("LastName") %>' /><br /> <asp:Label runat="server" ID="EmailLabel" AssociatedControlID="EmailTextBox" Text="E-mail" /> <asp:TextBox ID="EmailTextBox" runat="server" Text='<%#Bind("EmailAddress") %>' /> </td> <td> <asp:LinkButton ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" /> </td> </tr> </InsertItemTemplate> 函数:

locale.getpreferredencoding()

如果你早点运行,那么在utf-8中打开之后打开的所有文件(至少在我的win xp机器上测试)都会打开,因为这会覆盖模块方法,这将适用于所有平台。

答案 2 :(得分:1)

该帖子很旧,但是问题仍然存在(在Python 3.7和Windows 10下)。

我对解决方案进行了如下改进,确保不覆盖语言/国家/地区部分,而仅覆盖编码,并确保仅在Windows下完成:

if os.name == "nt":
    import _locale
    _locale._gdl_bak = _locale._getdefaultlocale
    _locale._getdefaultlocale = (lambda *args: (_locale._gdl_bak()[0], 'utf8'))

希望这对您有帮助...

答案 3 :(得分:0)

区域设置可以在 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。