Z jakiegoś powodu wydaje się, że Python ma problemy z BOM podczas odczytywania ciągów Unicode z pliku UTF-8. Rozważ następujące:Dlaczego łańcuchy Unicode w języku Python wymagają specjalnego traktowania dla pliku specyfikacji UTF-8?
with open('test.py') as f:
for line in f:
print unicode(line, 'utf-8')
Wydaje się proste, prawda?
To co myślałem, aż wpadłem go z linii poleceń i otrzymał:
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to
<undefined>
krótkie nawiedzenie Google ujawniło, że BOM musi być usuwane ręcznie:
import codecs
with open('test.py') as f:
for line in f:
print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')
To jeden działa dobrze. Jednak staram się dostrzec w tym jakąś zasługę.
Czy istnieje uzasadnienie powyżej opisanych zachowań? W przeciwieństwie do UTF-16 działa płynnie.
Nie można go zakodować, ponieważ U + FEFF jest nieprawidłowym noncharacter. Dzieje się tak dlatego, że pliki UTF-8 * nie powinny zawierać w nich LM! Nie są one wymagane ani zalecane. Endianness nie ma sensu z 8-bitowymi jednostkami kodu. Oni też to robią, bo nie można już po prostu zrobić "cat a b c> abc", jeśli pliki te zawierają nieistniejące (czytaj: * any *) BOMy w nich. Strumienie UTF-8 nie powinny zawierać LM. Jeśli chcesz określić zawartość pliku, powinieneś użyć prototocl wyższego poziomu. To tylko błąd systemu Windows. – tchrist
@tchrist - Wiesz, to wyjaśnienie w połączeniu z sugestią Josha Lee stałoby się idealną odpowiedzią. – Saul
OK, dodano.Mam nadzieję, że działa. – tchrist