Я получаю сообщение об ошибке со следующей скороговоркой:
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)
Не уверен, что это u'\ufeff'
такое, оно появляется, когда я просматриваю веб-страницы. Как я могу исправить ситуацию? .replace()
Строковый метод не работает на нем.
Ответы:
Символ Unicode
U+FEFF
- это метка порядка байтов, или BOM, и используется для обозначения разницы между кодировкой big- и little-endian 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
кодек требует наличия спецификации, иначе 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, вам, вероятно, следует выбрать другую кодировку для того, что вы пытались сделать.
источник
Содержимое, которое вы очищаете, кодируется в кодировке Unicode, а не в формате ascii, и вы получаете символ, который не преобразуется в ascii. Правильный «перевод» зависит от того, каким он был на исходной веб-странице. Страница Unicode Python дает представление о том, как это работает.
Вы пытаетесь распечатать результат или вставить его в файл? Ошибка предполагает, что данные, вызывающие проблему, записываются , а не читаются. Этот вопрос - хорошее место для поиска исправлений.
источник
Это основано на ответе Марка Толонена. Строка содержала слово «тест» на разных языках, разделенное знаком «|», так что вы можете увидеть разницу.
u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|' 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'))
Вот пробный запуск:
>>> u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|' >>> 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) utf-8 b'ABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|' >>> print('utf-8-sig %r' % e8s) utf-8-sig b'\xef\xbb\xbfABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|' >>> print('utf-16 %r' % e16) utf-16 b"\xff\xfeA\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00" >>> print('utf-16le %r' % e16le) utf-16le b"A\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00" >>> print('utf-16be %r' % e16be) utf-16be b"\x00A\x00B\x00C\x00t\x00e\x00s\x00t\x03\xb2\x8c\x9dXT\xc7\x04\x00m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x06'\x06.\x06*\x06(\x06'\x061\x00|mK\x8b\xd5\x00|n,\x8af\x00|0\xc60\xb90\xc8\x00|\t*\t0\t@\t\x15\tM\t7\t>\x00|\r*\r0\r?\r6\rK\r'\r(\x00|\x05\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x00|\x00k\x00i\x1e\xc3\x00m\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|" >>> print() >>> print('utf-8 w/ BOM decoded with utf-8 %r' % e8s.decode('utf-8')) utf-8 w/ BOM decoded with utf-8 '\ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|' >>> print('utf-8 w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig')) utf-8 w/ BOM decoded with utf-8-sig 'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|' >>> print('utf-16 w/ BOM decoded with utf-16 %r' % e16.decode('utf-16')) utf-16 w/ BOM decoded with utf-16 'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|' >>> print('utf-16 w/ BOM decoded with utf-16le %r' % e16.decode('utf-16le')) utf-16 w/ BOM decoded with utf-16le '\ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
Стоит знать, что только оба
utf-8-sig
иutf-16
возвращают исходную строку после обоихencode
иdecode
.источник
Эта проблема возникает в основном, когда вы сохраняете свой код Python в кодировке UTF-8 или UTF-16, потому что python автоматически добавляет некоторый специальный символ в начало кода (который не отображается текстовыми редакторами) для определения формата кодировки. Но когда вы пытаетесь выполнить код, он выдает синтаксическую ошибку в строке 1, то есть начало кода, потому что компилятор python понимает кодировку ASCII . когда вы просматриваете код файла с помощью функции read (), вы можете видеть, что в начале возвращаемого кода отображается '\ ufeff' . Самое простое решение этой проблемы - просто изменить кодировку обратно на кодировку ASCII.(для этого вы можете скопировать свой код в блокнот и сохранить его. Помните! выберите кодировку ASCII ... Надеюсь, это поможет.
источник