Ändern der "Schauplatz bevorzugte Codierung" in Python 3 in Windows

Ich bin mit Python 3 (erst vor kurzem den Wechsel von Python 2). Mein code läuft auf Linux, aber auch manchmal (nicht oft) auf Windows. Nach Python 3-Dokumentation für open(), die Standard-Kodierung für text-Datei aus locale.getpreferredencoding() wenn die encoding arg ist nicht im Lieferumfang enthalten. Ich möchte dieses default-Wert zu sein utf-8 für ein Projekt von mir, egal auf welchem Betriebssystem es läuft (momentan, es ist immer UTF-8 für Linux, aber nicht für Windows). Das Projekt hat viele, viele Anrufe zu open() - und das möchte ich nicht hinzufügen encoding='utf-8' alle von Ihnen. So, ich möchte das ändern des Gebietsschemas bevorzugte Codierung in Windows, da Python 3 sieht.

Fand ich eine Vorherige Frage
"Ändern der "Schauplatz bevorzugte Codierung"", die eine akzeptierte Antwort, so dass ich dachte, ich war gut zu gehen. Leider ist aber weder der vorgeschlagenen Befehle beantworten und Ihr Erster Kommentar bei mir funktioniert in Windows. Speziell, dass die Antwort akzeptiert, und seine ersten Kommentar vorschlagen ausgeführt chcp 65001 und set PYTHONIOENCODING=UTF-8, und ich habe beide ausprobiert. Bitte siehe übersetzung unten von meinem cmd-Fenster:

> 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 den beiden Kommandos, meine geöffneten Datei das encoding ist immer noch cp1252 statt der beabsichtigten utf-8.

  • Vielleicht ist es nur mein Stil, aber ich würde lieber schreiben Sie ein wrapper-open () - Funktion, in dem Sie die zu verwendende Kodierung.
  • Verwenden Sie nicht chcp 65001. Die Windows-Konsole nicht ordnungsgemäß unterstützt UTF-8, und es ist nicht das tun, was Sie sowieso wollen. locale.getpreferredencoding hat nichts zu tun mit der Konsole Zeichensatz; es basiert auf dem Windows-Gebietsschema der ANSI-Codierung. Zum Beispiel, wenn Sie anrufen Win32 CreateFileA (ANSI) statt CreateFileW (UTF-16), den Pfad der Datei string wird dekodiert als ANSI-string (z.B. Windows-1252). Windows nicht UTF-8 als ANSI-Zeichen festgelegt, und die C-runtime auch nicht erlaubt, die Verwendung von UTF-8 für ein Gebietsschema.
  • Danke für die info, aber es hat zu viel Windows-jargon für mich. Verwende ich selten Windows. Alles was ich will ist eine Art zu sagen: entweder Windows 8 oder Python 3: "Liebe Windows 8 / Python 3, Bitte beachten Sie, dass alle text-Dateien auf diesen computer sollte in UTF-8 kodiert, ohne Ausnahme. Bitte denken Sie daran, diese Tatsache in Zukunft beim öffnen von text-Dateien. Vielen Dank."
  • keine solche Sache vorhanden ist. Das native format-string unter Windows wird UTF-16, 16-bit - wchar_t strings. Die Windows-API unterstützt nur 8-bit-Kodierungen für die legacy-ANSI-API, die leider nicht UTF-8. Python ist die bevorzugte Codierung ist, einfach rufen GetACP, um die ANSI-codepage. Ich sympathisiere mit Ihnen und wünschen, dass io.TextIOWrapper standardmäßig auf UTF-8 auf allen Plattformen (Ihre Annahme über Linux ist nicht immer gültig, entweder). Wie die Dinge stehen, müssen Sie eine wrapper-Funktion, wie bereits vorgeschlagen.
  • Ihre Windows-details über meinen Kopf, wie zuvor. Aber Sie scheinen zuversichtlich, dass es gibt keine Möglichkeit, das zu tun, was ich will, entweder in Windows 8 oder in Python 3. (Ich hätte nicht unbedingt erwartet, dass es möglich wäre, außer dem vorherigen thread von mir verlinkten, gab mir viele falsche Hoffnungen!) Wenn Sie wollen, um eine "Antwort", die besagt, dass dies unmöglich ist in Windows 8 und in Python 3 (außer hacks natürlich), dann werde ich akzeptieren, dass Antwort.
  • Ein bisschen Mühe bekommt man den TextIOWrapper Quelle und darin zu sehen, dass _Py_device_encoding was nutzt die Windows-Konsole-Zeichensatz (GetConsoleCP), aber nur für stdin, stdout und stderr. Andernfalls ruft es getpreferredencoding, die fordert, _getdefaultlocale und damit GetACP.

InformationsquelleAutor walrus | 2015-07-17
Schreibe einen Kommentar