Ä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 Win32CreateFileA
(ANSI) stattCreateFileW
(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 rufenGetACP
, um die ANSI-codepage. Ich sympathisiere mit Ihnen und wünschen, dassio.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 esgetpreferredencoding
, die fordert,_getdefaultlocale
und damitGetACP
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als der Python ist3.5.1 dieser hack sieht so aus:
Alle Dateien geöffnet, danach übernehmen die Standard-Codierung
utf8
.utf_8_sig
wie Sie kümmern sich um die BOM-Zeichen, dass manche Windows-Editoren neigen dazu, zu Spritzen in die Dateien, auch für solche endian-neutral encoding alsutf8
.ich weiß, es ist eine echte hacky umgehen, aber Sie könnte neu zu definieren
locale.getpreferredencoding()
Funktion etwa so:wenn Sie diese frühzeitig, alle geöffneten Dateien nach (zumindest in meinen Tests auf einem win xp Rechner) öffnen, die in utf-8, und so überschreibt dieses die Modul-Methode dies gilt für alle Plattformen.