Zugegeben, das ist kein toller Titel, aber ehrlich gesagt war ich mir nicht sicher, wie ich die Frage formulieren sollte, ohne einen Aufsatz als Frage zu posten. Diese Beschreibung sollte etwas mehr Substanz verleihen.
Problem:
Ich habe ein Python-Skript (nicht von mir geschrieben), das ich unter Windows mit Python 2.7 ausführe. Es ist relativ einfach und extrahiert Informationen aus verschiedenen Quellen und DRUCKT die Ausgabe auf das Terminal. Einige dieser Ausgaben verwenden Zeichen in einem Nicht-ASCII-Zeichensatz, und hier begann der Spaß.
Während das Python-Skript im Terminal einwandfrei lief und auf dem Bildschirm druckte, erhielt ich eine Fehlermeldung, sobald ich eine Dateiumleitung hinzufügte, und das Python-Skript stürzte ab. Nach einer MENGE Recherche schien dies auf die Art und Weise zurückzuführen zu sein, wie Python 2.7 mit Unicode umgeht, und ich habe dies umgangen, indem ich eine Windows-Umgebungsvariable für Python festgelegt habe. Diese lautete:
$env:PYTHONIOENCODING="UTF-8"
in PowerShell und
Set PYTHONIOENCODING="UTF-8"
im CMD.
OK, jetzt kann die Ausgabe des Python-Skripts ohne Absturz in eine Datei umgeleitet werden. Das Problem ist, dass die beiden Umgebungen unterschiedliche Ergebnisse liefern. Das grundlegende Format zum Ausführen des Python-Skripts ist:
python pythonscript.py parm1 > test.txt
Obwohl dies sowohl in CMD als auch in PowerShell funktioniert, erhalte ich am Ende eine Datei mit unterschiedlichen Kodierungen und Zeichen. Ein Zeichen, das Probleme verursacht, ist beispielsweise ø
. Wenn ich die obige Zeile in CMD ausführe, wird die resultierende Datei als kodiert UTF-8
und zeigt dieses Zeichen korrekt an. In PowerShell führt das Ausführen desselben Befehls zu einer Datei, die als kodiert ist UCS-2 LE BOM
(wie in NotePad++ angezeigt), und das obige Zeichen wird tatsächlich als 2 Zeichen angezeigt ├©
.
Noch bizarrer ist, dass in beiden Umgebungen die falschen Zeichen angezeigt werden, wenn ich keine Umleitung vornehme (also nur auf dem Terminal PRINT ausführe).
Ich habe auch versucht, in PowerShell eine Weiterleitung an das Out-File-CmdLet durchzuführen, also:
python pythonscript.py parm1 | out-file -encoding UTF8 test.txt
Dies führt zu einer Datei, die als kodiert ist UTF-8-BOM
, aber trotzdem werden die falschen Zeichen angezeigt. Ich habe hier verschiedene Kodierungsarten ausprobiert, und obwohl ich am Ende unterschiedliche Dateikodierungen und unterschiedliche Zeichen erhalten habe, scheint nichts richtig zu sein.
Ich habe mir auch die Codepage beider Umgebungen angesehen, indem ich ausgeführt habe chcp
. In beiden Fällen wird zurückgegeben Active code page: 850
. Ich habe versucht, PowerShell auf eine Codepage von einzustellen 65001
(was ist utf-8
), und das hat keinen Unterschied gemacht.
Ich bin also völlig verwirrt.