Warum Python-unicode-Zeichenfolgen, die eine Besondere Behandlung erfordern, für die UTF-8-BOM?
Aus irgendeinem Grund, Python zu sein scheint, Probleme mit BOM beim Lesen von unicode-Zeichenfolgen aus einer UTF-8 - Datei. Betrachten Sie das folgende:
with open('test.py') as f:
for line in f:
print unicode(line, 'utf-8')
Scheint einfach, nicht wahr?
Das ist, was ich dachte, bis ich lief es von der Kommandozeile aus und bekam:
UnicodeEncodeError: 'charmap' codec can T encode character u'\ufeff'
in Stellung 0: - Charakter-Karten zu<undefined>
Einen kurzen Besuch zu Google ergab, dass BOM werden deaktiviert manuell:
import codecs
with open('test.py') as f:
for line in f:
print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')
Diese läuft einwandfrei. Aber ich bin kämpfen, um zu sehen, ein Verdienst in diesem.
Gibt es eine Logik hinter den oben beschriebenen Verhalten? Im Gegensatz dazu, UTF-16 arbeitet nahtlos.
- Kann es nicht codieren, da U+FEFF ist eine ungültige nicht. Es ist, weil die UTF-8-Dateien sind nicht enthalten soll, eine Stückliste in Ihnen! Sie sind weder vorgeschrieben noch werden Sie empfohlen. Endianness macht keinen Sinn mit 8-bit-code-Einheiten. Sie Schrauben die Dinge, auch, weil Sie können nicht mehr einfach tun
cat a b c > abc
wenn diese Dateien überflüssige (read: alle) Stücklisten in Ihnen. UTF-8-streams sollte nicht enthalten eine Stückliste. Wenn Sie brauchen, um geben Sie den Inhalt der Datei, Sie sollen auf eine höhere Ebene prototocl. Dies ist nur ein Windows-Fehler. - Wissen Sie, diese Erklärung in Kombination mit Josh Lee ' s Vorschlag würde in eine perfekte Antwort.
- Ok, Hinzugefügt. Hoffe, dass das funktioniert.
- Habe deine Fehlermeldung passieren zu erwähnen, die mit dem Namen
cp437.py
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
'utf-8-sig'
Codierung verbraucht der BOM Signatur in Ihrem Namen.Sie schrieb:
Wenn Sie angeben, die
"utf-8"
Codierung in Python, es nimmt Sie beim Wort. UTF-8-Dateien sollen nicht enthalten eine Stückliste in Ihnen. Sie sind weder vorgeschrieben noch werden Sie empfohlen. Endianness macht keinen Sinn mit 8-bit-code-Einheiten.Stücklisten Schraube Dinge, auch, weil Sie können nicht mehr einfach tun:
wenn diese UTF-8-Dateien haben überflüssige (read: alle) Stücklisten in Ihnen. Sehen Sie jetzt, warum die Stücklisten sind so dumm/schlecht/schädlich in UTF-8? Sie haben tatsächlich Dinge brechen.
Ist eine Stückliste Metadaten, nicht Daten, und die UTF-8-encoding-Spezifikation macht keine Zulage für die Art, wie die UTF-16 und UTF-32-Spezifikationen zu tun. Also Python nahm Sie beim Wort und folgte dem spec. Schwer Schuld dafür.
Wenn Sie versuchen, verwenden Sie die Stückliste als Dateityp Magische Zahl geben Sie den Inhalt der Datei, Sie sollten wirklich nicht tun. Sie sind wirklich sollen eine höhere Ebene prototocl für diese Metadaten, Zwecke, nur, wie es mit einem MIME-Typ.
Ist das nur eine lahme Windows-Fehler, die Problemumgehung für die Verwendung des alternativen Kodierung
"utf-8-sig"
zu pass off zu Python.ZERO WIDTH NO-BREAK SPACE
.