Ich bin wirklich verwirrt mit dem codecs.open function
. Wenn ich es tue:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
Es gibt mir den Fehler
UnicodeDecodeError: Der Codec 'ascii' kann das Byte 0xef an Position 0 nicht dekodieren: Ordnungszahl nicht im Bereich (128)
Wenn ich mache:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
Es funktioniert gut.
Die Frage ist, warum die erste Methode fehlschlägt. Und wie füge ich die Bombe ein?
Wenn die zweite Methode die richtige ist, wozu dann codecs.open(filename, "w", "utf-8")
?
python
utf-8
byte-order-mark
John Jiang
quelle
quelle
Antworten:
Ich glaube, das Problem ist, dass
codecs.BOM_UTF8
es sich um eine Byte-Zeichenfolge handelt, nicht um eine Unicode-Zeichenfolge. Ich vermute, der Datei-Handler versucht zu erraten, was Sie wirklich meinen, basierend auf "Ich soll Unicode als UTF-8-codierten Text schreiben, aber Sie haben mir eine Byte-Zeichenfolge gegeben!"Versuchen Sie, die Unicode-Zeichenfolge für die Bytereihenfolge (dh Unicode U + FEFF) direkt zu schreiben, sodass die Datei diese nur als UTF-8 codiert:
(Das scheint die richtige Antwort zu geben - eine Datei mit Bytes EF BB BF.)
EDIT: S. Lotts Vorschlag , "utf-8-sig" als Codierung zu verwenden, ist besser als das explizite Schreiben der Stückliste selbst, aber ich werde diese Antwort hier belassen, da sie erklärt, was vorher falsch gelaufen ist.
quelle
codecs.open
anstatt nuropen
Lesen Sie Folgendes: http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig
Mach das
Die resultierende Datei ist UTF-8 mit der erwarteten Stückliste.
quelle
temp.close()
?open
.@ S-Lott bietet die richtige Vorgehensweise, aber der Python- Interpreter erweitert die Unicode- Probleme und bietet weitere Einblicke.
Jon Skeet hat Recht (ungewöhnlich) mit dem
codecs
Modul - es enthält Byte-Strings:Wenn Sie eine andere Nit auswählen,
BOM
hat der einen Standard- Unicode- Namen und kann wie folgt eingegeben werden:Es ist auch zugänglich über
unicodedata
:quelle
Ich verwende den Befehl file * nix, um eine unbekannte Zeichensatzdatei in eine utf-8-Datei zu konvertieren
quelle
# coding: utf8
stattdessen# -*- coding: utf-8 -*-
ist viel einfacher zu merken.