u 'ufeff ' в строке Python



Я получаю сообщение об ошибке со следующей скороговоркой:



UnicodeEncodeError: 'ascii' codec can't encode character u'ufeff' in position 155: ordinal not in range(128)


не уверен, что u'ufeff' это, он появляется, когда я веб-скребок. Как я могу исправить ситуацию? Элемент .replace() строковый метод не работает на нем.

1094   6  

6 ответов:

символ Unicode U+FEFF является меткой порядка байтов или BOM и используется для определения разницы между кодировкой UTF - 16 с большим и малым концом. Если вы декодируете веб-страницу с помощью правильного кодека, Python удалит его для вас. Примеры:

#!python2
#coding: utf8
u = u'ABC'
e8 = u.encode('utf-8')        # encode without BOM
e8s = u.encode('utf-8-sig')   # encode with BOM
e16 = u.encode('utf-16')      # encode with BOM
e16le = u.encode('utf-16le')  # encode without BOM
e16be = u.encode('utf-16be')  # encode without BOM
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'    # Adds BOM and encodes using native processor endian-ness.
utf-16le  'A\x00B\x00C\x00'
utf-16be  '\x00A\x00B\x00C'

utf-8  w/ BOM decoded with utf-8     u'\ufeffABC'    # doesn't remove BOM if present.
utf-8  w/ BOM decoded with utf-8-sig u'ABC'          # removes BOM if present.
utf-16 w/ BOM decoded with utf-16    u'ABC'          # *requires* BOM to be present.
utf-16 w/ BOM decoded with utf-16le  u'\ufeffABC'    # doesn't remove BOM if present.

отметим, что utf-16 кодировка требует BOM должен присутствовать, или Python не будет знать, являются ли данные большими или маленькими.

я столкнулся с этим на Python 3 и нашел этот вопрос (и решение). При открытии файла Python 3 поддерживает ключевое слово encoding для автоматической обработки кодировки.

без него спецификация включается в результат чтения:

>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'

давая правильную кодировку, спецификация опущена в результате:

>>> f = open('file', mode='r', encoding='utf-8-sig')
>>> f.read()
'test'

просто мои 2 цента.

содержимое, которое вы очищаете, кодируется в юникоде, а не в тексте ascii, и вы получаете символ, который не преобразуется в ascii. Правильный "перевод" зависит от того, что исходная веб-страница думала, что это было. страница Юникода питона дает фон о том, как это работает.

вы пытаетесь распечатать результат или вставить его в файл? Ошибка предполагает, что это писать данные, которые вызывают проблему, не читая его. этот вопрос - это хорошее место, чтобы искать исправления.

этот персонаж является BOM или "метка порядка байтов". Он обычно принимается как первые несколько байтов файла, рассказывая вам, как интерпретировать кодировку остальных данных. Вы можете просто удалить символ, чтобы продолжить. Хотя, поскольку ошибка говорит, что вы пытались преобразовать в "ascii", вы, вероятно, должны выбрать другую кодировку для того, что вы пытались сделать.

эта проблема возникает в основном при сохранении кода python в кодировка UTF-8 или UTF-16 потому что python автоматически добавляет специальный символ в начале кода (который не отображается текстовыми редакторами) для идентификации формата кодировки. Но, когда вы пытаетесь выполнить код, он дает вам синтаксическую ошибку в строке 1, т. е. начало кода, потому что компилятор python понимает кодировку ASCII. при просмотре кода файла с помощью read () функция, которую вы можете увидеть в начале возвращаемого кода 'ufeff\' показано. Самое простое решение этой проблемы - это просто изменение кодировки обратно в кодировку ASCII(для этого вы можете скопировать код в блокнот и сохранить его запомнить! выберите кодировку ASCII... Надеюсь, это поможет.

в частности, Знак порядка байтов feff является индикатором кодировки utf-16. Поскольку все байты utf-16 редко используются, есть две разные схемы кодирования, которые используют люди. Поскольку различные кодировки в основном просто переворачивают байты в utf-16, стандарт заключается в том, что Знак порядка байтов всегда будет feff. Таким образом, если кто-то отправляет что-то с меткой порядка байтов ffef, кодировщик unicode знает, чтобы перевернуть порядок всех байтов в документе, который следует.

Comments

    Ничего не найдено.