UnicodeDecodeError: кодек ascii не может декодировать байт 0xef в позиции 1

У меня есть несколько проблем, пытающихся закодировать строку в UTF-8. Я пробовал много вещей, включая использование string.encode('utf-8') и unicode(string) , но я получаю ошибку:

UnicodeDecodeError: кодек ascii не может декодировать байт 0xef в позиции 1: порядковый номер не в диапазоне (128)

Это моя строка:

 (。・ω・。)ノ 

Я не понимаю, что происходит, идея?

Изменить: проблема заключается в том, что печать строки, как она, отображается неправильно. Кроме того, эта ошибка, когда я пытаюсь ее преобразовать:

 Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' >>> s1 = s.decode('utf-8') >>> print s1 Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128) 

12 Solutions collect form web for “UnicodeDecodeError: кодек ascii не может декодировать байт 0xef в позиции 1”

Это связано с тем, что кодировка вашего терминала не установлена ​​на UTF-8. Вот мой терминал

 $ echo $LANG en_GB.UTF-8 $ python Python 2.7.3 (default, Apr 20 2012, 22:39:59) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' >>> s1 = s.decode('utf-8') >>> print s1 (。・ω・。)ノ>>> 

На моем терминале пример работает с приведенным выше, но если я избавлюсь от настройки LANG то это не сработает

 $ unset LANG $ python Python 2.7.3 (default, Apr 20 2012, 22:39:59) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' >>> s1 = s.decode('utf-8') >>> print s1 Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128) >>> 

Проконсультируйтесь с документами для своего варианта linux, чтобы узнать, как сделать это изменение постоянным.

пытаться:

 string.decode('utf-8') # or: unicode(string, 'utf-8') 

редактировать:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8') дает u'(\uff61\uff65\u03c9\uff65\uff61)\uff89' , что верно.

поэтому ваша проблема должна быть в каком-то другом месте, возможно, если вы попытаетесь что-то сделать с ней, произойдет неявное преобразование (может быть печать, запись в поток …)

чтобы сказать больше, нам нужно будет увидеть какой-то код.

Мой комментарий +1 к mata на https://stackoverflow.com/a/10561979/1346705 и демонстрации Ника Крейга-Вуда. Вы правильно декодировали строку. Проблема заключается в команде print поскольку она преобразует строку Unicode в консольную кодировку, а консоль не может отображать строку. Попробуйте записать строку в файл и посмотреть результат с помощью какого-нибудь достойного редактора, который поддерживает Unicode:

 import codecs s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' s1 = s.decode('utf-8') f = codecs.open('out.txt', 'w', encoding='utf-8') f.write(s1) f.close() 

Затем вы увидите (。・ω・。)ノ .

Если вы работаете на удаленном хосте, посмотрите на /etc/ssh/ssh_config на локальном ПК.

Когда этот файл содержит строку:

 SendEnv LANG LC_* 

прокомментируйте это, добавив # во главе строки. Это может помочь.

С помощью этой строки ssh отправляет языковые переменные среды, связанные с вашим компьютером, на удаленный хост. Это вызывает множество проблем.

Нет проблем с моим терминалом. Вышеупомянутые ответы помогли мне взглянуть в правильном направлении, но это не сработало для меня, пока я не добавил 'ignore' :

 fix_encoding = lambda s: s.decode('utf8', 'ignore') 

Как указано в комментарии ниже, это может привести к нежелательным результатам. OTOH также может просто сделать трюк достаточно хорошо, чтобы заставить все работать, и вы не заботитесь о потере некоторых персонажей.

Похоже, ваша строка закодирована в utf-8 , так что же это за проблема? Или что вы здесь делаете?

 Python 2.7.3 (default, Apr 20 2012, 22:39:59) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' >>> s1 = s.decode('utf-8') >>> print s1 (。・ω・。)ノ>>> s2 = u'(。・ω・。)ノ' >>> s2 == s1 True >>> s2 u'(\uff61\uff65\u03c9\uff65\uff61)\uff89' 

это работает для ubuntu 15.10:

 sudo locale-gen "en_US.UTF-8" sudo dpkg-reconfigure locales 

В моем случае это было вызвано сохранением моего файла Unicode с помощью «спецификации». Чтобы решить эту проблему, я взломал файл с помощью BBEdit и сделал «Сохранить как …», выбрав для кодирования «Unicode (UTF-8)», а не то, что он пришел, с которым был «Unicode (UTF-8, с спецификацией) "

Я получал такую ​​же ошибку, и обнаружил, что консоль не может отображать строку на другом языке. Поэтому я сделал следующие изменения кода, чтобы установить default_charset как UTF-8.

 data_head = [('\x81\xa1\x8fo\x89\xef\x82\xa2\x95\xdb\x8f\xd8\x90\xa7\x93x\x81\xcb3\x8c\x8e\x8cp\x91\xb1\x92\x86(\x81\x86\x81\xde\x81\x85)\x81\xa1\x8f\x89\x89\xf1\x88\xc8\x8aO\x81A\x82\xa8\x8b\xe0\x82\xcc\x90S\x94z\x82\xcd\x88\xea\x90\xd8\x95s\x97v\x81\xa1\x83}\x83b\x83v\x82\xcc\x82\xa8\x8e\x8e\x82\xb5\x95\xdb\x8c\xaf\x82\xc5\x8fo\x89\xef\x82\xa2\x8am\x92\xe8\x81\xa1', 'shift_jis')] default_charset = 'UTF-8' #can also try 'ascii' or other unicode type print ''.join([ unicode(lin[0], lin[1] or default_charset) for lin in data_head ]) 

Это лучший ответ: https://stackoverflow.com/a/4027726/2159089

в linux:

 export PYTHONIOENCODING=utf-8 

поэтому sys.stdout.encoding в порядке.

Я решаю эту проблему в файле settings.py с помощью «ENGINE»: «django.db.backends.mysql», не использую «ДВИГАТЕЛЬ»: «mysql.connector.django»,

Просто преобразуйте текст явно в строку с помощью str() . Работал для меня.

  • Чтение файла CSV UTF8 с помощью Python
  • Как преобразовать строку в utf-8 в Python
  • Импорт из Oracle с использованием правильной кодировки с помощью Python
  • Как я могу получить все пробелы в UTF-8 в Python?
  • Как правильно разобрать HTML в кодировке UTF-8 в строки Unicode с помощью BeautifulSoup?
  • Файл CSV Python 3, предоставляющий UnicodeDecodeError: кодек «utf-8» не может декодировать ошибку байта при печати
  • Python: UnicodeDecodeError: кодек ascii не может декодировать байт 0xef в позиции 0: порядковый номер не в диапазоне (128)
  • Проблема UTF-8 в python при чтении символов
  • Общая поддержка Unicode / UTF-8 для файлов csv в Python 2.6
  • Python конвертирует html ascii-кодированный текст в utf8
  • Печать строки unicode в python независимо от среды
  • Python - лучший язык программирования в мире.