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?
InformationsquelleAutor Saul | 2011-09-01
Schreibe einen Kommentar