Die zuvor akzeptierte Antwort falsch ist.
u'\ufffe'
ist kein Zeichen. Wenn Sie es in einer Unicode-Saite bekommen, hat jemand mächtig gestopft.
Die BOM ist (auch bekannt als ZERO WIDTH NO-BREAK SPACE) u'\ufeff'
>>> UNICODE_BOM = u'\N{ZERO WIDTH NO-BREAK SPACE}'
>>> UNICODE_BOM
u'\ufeff'
>>>
lesen this (für BOM Strg-F-Suche) und this und this (Strg-F Suche nach BOM).
Hier ist eine richtige und Typo/braino feste Antwort:
Decode Ihre Eingabe in unicode_str
. Dann tun Sie dies:
# If I mistype the following, it's very likely to cause a SyntaxError.
UNICODE_BOM = u'\N{ZERO WIDTH NO-BREAK SPACE}'
if unicode_str and unicode_str[0] == UNICODE_BOM:
unicode_str = unicode_str[1:]
Bonus: mit einer benannte Konstante Ihrer Leser ein bisschen mehr von einem Anhaltspunkt gibt, was los ist, als dies eine Sammlung von scheinbar willkürlichen hexoglyphics.
Update Leider gibt es in der Python-Standardbibliothek keine passende benannte Konstante.
Leider stellt die Codecs Modul nur „eine Schlinge und eine Täuschung“:
>>> import pprint, codecs
>>> pprint.pprint([(k, getattr(codecs, k)) for k in dir(codecs) if k.startswith('BOM')])
[('BOM', '\xff\xfe'), #### aarrgghh!! ####
('BOM32_BE', '\xfe\xff'),
('BOM32_LE', '\xff\xfe'),
('BOM64_BE', '\x00\x00\xfe\xff'),
('BOM64_LE', '\xff\xfe\x00\x00'),
('BOM_BE', '\xfe\xff'),
('BOM_LE', '\xff\xfe'),
('BOM_UTF16', '\xff\xfe'),
('BOM_UTF16_BE', '\xfe\xff'),
('BOM_UTF16_LE', '\xff\xfe'),
('BOM_UTF32', '\xff\xfe\x00\x00'),
('BOM_UTF32_BE', '\x00\x00\xfe\xff'),
('BOM_UTF32_LE', '\xff\xfe\x00\x00'),
('BOM_UTF8', '\xef\xbb\xbf')]
>>>
Update 2 Wenn Sie noch nicht Ihre Eingabe decodiert und wollen es für eine Stückliste zu überprüfen, müssen Sie Überprüfen Sie für TWO verschiedene Stücklisten für UTF-16 und mindestens TWO verschiedene Stücklisten für UTF-32. Wenn es nur jeweils einen Weg gäbe, würden Sie keine Stückliste benötigen, oder?
hier wörtlich ungeschönte aus meinem eigenen Code ist meine Lösung für dieses Problem:
def check_for_bom(s):
bom_info = (
('\xFF\xFE\x00\x00', 4, 'UTF-32LE'),
('\x00\x00\xFE\xFF', 4, 'UTF-32BE'),
('\xEF\xBB\xBF', 3, 'UTF-8'),
('\xFF\xFE', 2, 'UTF-16LE'),
('\xFE\xFF', 2, 'UTF-16BE'),
)
for sig, siglen, enc in bom_info:
if s.startswith(sig):
return enc, siglen
return None, 0
Der Eingang s
sollte mindestens die ersten 4 Bytes Ihrer eingegeben werden. Es gibt die Codierung zurück, die zum Dekodieren des Post-BOM-Teils Ihrer Eingabe verwendet werden kann, zuzüglich der Länge der Stückliste (falls vorhanden).
Wenn Sie paranoid sind, könnten Sie weitere 2 (nicht standardmäßige) UTF-32-Ordnungen zulassen, aber Python liefert keine Kodierung für sie und ich habe noch nie von einem tatsächlichen Vorkommen gehört. t stören.
Ooh! Sehr schön! Ich werde es versuchen, sobald ich kann. – Cameron
Funktioniert wunderbar (obwohl Chrome mysteriöserweise den Fehler nicht mehr gab, selbst mit meinem alten (falschen) Code - das ist es, was ich bekomme, wenn ich eine ganze Reihe von Änderungen gleichzeitig mache). – Cameron