Символ Unicode U+FEFF
- это метка порядка байтов, или BOM, и используется для обозначения разницы между кодировкой big- и little-endian UTF-16. Если вы декодируете веб-страницу с помощью правильного кодека, Python удалит его за вас. Примеры:
u = u'ABC'
e8 = u.encode('utf-8')
e8s = u.encode('utf-8-sig')
e16 = u.encode('utf-16')
e16le = u.encode('utf-16le')
e16be = u.encode('utf-16be')
print 'utf-8 %r' % e8
print 'utf-8-sig %r' % e8s
print 'utf-16 %r' % e16
print 'utf-16le %r' % e16le
print 'utf-16be %r' % e16be
print
print 'utf-8 w/ BOM decoded with utf-8 %r' % e8s.decode('utf-8')
print 'utf-8 w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig')
print 'utf-16 w/ BOM decoded with utf-16 %r' % e16.decode('utf-16')
print 'utf-16 w/ BOM decoded with utf-16le %r' % e16.decode('utf-16le')
Обратите внимание, что EF BB BF
это спецификация в кодировке UTF-8. Он не требуется для UTF-8, но служит только подписью (обычно в Windows).
Выход:
utf-8 'ABC'
utf-8-sig '\xef\xbb\xbfABC'
utf-16 '\xff\xfeA\x00B\x00C\x00'
utf-16le 'A\x00B\x00C\x00'
utf-16be '\x00A\x00B\x00C'
utf-8 w/ BOM decoded with utf-8 u'\ufeffABC'
utf-8 w/ BOM decoded with utf-8-sig u'ABC'
utf-16 w/ BOM decoded with utf-16 u'ABC'
utf-16 w/ BOM decoded with utf-16le u'\ufeffABC'
Обратите внимание, что utf-16
кодек требует наличия спецификации, иначе Python не узнает, являются ли данные прямым или прямым порядком байтов.