web-dev-qa-db-ja.com

WindowsでPython 3のロケール優先エンコーディング」を変更する

私はPython 3(最近Python 2から切り替えました)を使用しています。私のコードは通常Linuxで実行されますが、Windowsでも実行されることがあります(頻繁ではありません)。 Python 3ドキュメント open() 、テキストファイルのデフォルトのエンコーディングはlocale.getpreferredencoding()からencoding argが指定されていません。実行しているOSに関係なく、私のプロジェクトではこのデフォルト値を_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()
_

両方の提案されたコマンドの後でも、開いたファイルのエンコーディングは、意図した_cp1252_ではなく_utf-8_であることに注意してください。

18
walrus

Python3.5.1の時点で、このハックは次のようになります。

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

その後開かれるすべてのファイルは、デフォルトのエンコーディングがutf8であると想定します。

14
axil

私はそれが本当のハッキーな回避策であることを知っていますが、次のようにlocale.getpreferredencoding()関数を再定義することができます。

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

これを早い段階で実行すると、(少なくともwin xpマシンでのテストでは)utf-8で開いた後に開かれたすべてのファイルが、モジュールメソッドをオーバーライドするため、すべてのプラットフォームに適用されます。

7
James Kent