2015-07-17 11 views
6

Ich benutze Python 3 (kürzlich von Python 2 gewechselt). Mein Code läuft normalerweise unter Linux, aber auch manchmal (nicht oft) unter Windows. Laut Python 3-Dokumentation für open() lautet die Standardcodierung für eine Textdatei locale.getpreferredencoding(), wenn der encoding arg nicht angegeben ist. Ich möchte, dass dieser Standardwert utf-8 für ein Projekt von mir ist, egal auf welchem ​​Betriebssystem es läuft (derzeit ist es immer UTF-8 für Linux, aber nicht für Windows). Das Projekt hat viele Aufrufe an open() und ich möchte nicht alle encoding='utf-8' hinzufügen. Daher möchte ich die bevorzugte Codierung des Gebietsschemas in Windows ändern, wie Python 3 es sieht.Ändern der "Locale bevorzugte Codierung" in Python 3 in Windows

Ich fand eine vorherige Frage "Changing the "locale preferred encoding"", die eine angenommene Antwort hat, also dachte ich, dass ich gut war zu gehen. Aber leider funktioniert keiner der vorgeschlagenen Befehle in dieser Antwort und der erste Kommentar für mich in Windows. Insbesondere diese angenommene Antwort und ihr erster Kommentar schlagen vor, chcp 65001 und set PYTHONIOENCODING=UTF-8 zu laufen, und ich habe beides versucht. Bitte beachten Sie Transkript unten aus meinem Fenster 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() 

Beachten Sie, dass auch nach beiden Befehle vorgeschlagen, meine geöffnete Datei die Codierung noch ist cp1252 statt der beabsichtigten utf-8.

+0

Vielleicht ist es nur mein Stil, aber ich würde lieber eine Wrapper open() -Funktion schreiben, in der Sie die Codierung angeben. –

+0

Verwenden Sie nicht 'chcp 65001'. Die Windows-Konsole unterstützt UTF-8 nicht richtig und tut sowieso nicht, was Sie wollen. 'locale.getpreferredencoding' hat nichts mit der Konsolen-Codepage zu tun; Es basiert auf der ANSI-Codierung der Windows-Ländereinstellung. Wenn Sie beispielsweise Win32 'CreateFileA' (ANSI) anstelle von' CreateFileW' (UTF-16) aufrufen, wird die Dateipfadzeichenfolge als ANSI-Zeichenfolge (z. B. Windows-1252) dekodiert. Windows lässt nicht zu, dass UTF-8 als ANSI-Zeichensatz verwendet wird, und die C-Laufzeit erlaubt auch nicht die Verwendung von UTF-8 für ein Gebietsschema. – eryksun

+0

@eryksun Danke für die Info, aber es hat zu viel Windows-spezifischen Jargon für mich. Ich benutze selten Windows. Alles, was ich will, ist eine Möglichkeit, zu Windows 8 oder Python 3 zu sagen: "Sehr geehrte Windows 8/Python 3, Bitte beachten Sie, dass alle Textdateien auf diesem Computer ohne Ausnahme in UTF-8 codiert werden sollten. Bitte beachten Sie diese Tatsache in der Zukunft beim Öffnen von Textdateien. Danke. " – walrus

Antwort

3

ich weiß, sein ein echtes Hacky Problem zu umgehen, aber man konnte die locale.getpreferredencoding() Funktion wie so neu zu definieren:

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

, wenn Sie dies frühzeitig ausführen, wird alle Dateien nach dem Öffnen (bei damit in meinen Tests auf einem Win XP Maschine) in utf-8 öffnen, und da dies die Modulmethode überschreibt, würde dies für alle Plattformen gelten.

+0

Ich habe es auf Python 3.5.1 und Windows 7 getestet und [gucken Sie] (http://Stackoverflow.com/a/34345136/4933641), womit ich endete. – axil

3

Ab python3.5.1 dieser Hack sieht wie folgt aus:

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

Alle danach geöffneten Dateien wird die Standardcodierung übernehmen utf8 zu sein.

+0

Oder noch besser, 'utf_8_sig', da es sich um den BOM-Charakter kümmert, den manche Windows-Editoren selbst für eine endian-neutrale Codierung wie utf8 in die Dateien einfügen. – axil

Verwandte Themen