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)
Ответы
Ответ 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, чтобы узнать, как сделать это изменение постоянным.
Ответ 2
попробовать:
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'
, что верно.
поэтому ваша проблема должна быть в каком-то другом месте, возможно, если вы попытаетесь что-то сделать с ней, произойдет неявное преобразование (может быть печать, запись в поток...)
чтобы сказать больше, нам нужно будет увидеть код.
Ответ 3
Мой комментарий +1 к mata на fooobar.com/questions/65482/... и демонстрации Ник Крейг-Вуд. Вы правильно декодировали строку. Проблема заключается в команде 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()
Затем вы увидите (。・ω・。)ノ
.
Ответ 4
Если вы работаете на удаленном хосте, посмотрите /etc/ssh/ssh_config
на локальном ПК.
Если этот файл содержит строку:
SendEnv LANG LC_*
прокомментируйте это, добавив #
в начало строки. Это может помочь.
В этой строке ssh
отправляет языковые переменные среды, связанные с вашим компьютером, на удаленный хост. Это вызывает проблемы .
Ответ 5
Нет проблем с моим терминалом. Вышеупомянутые ответы помогли мне взглянуть в правильном направлении, но это не сработало для меня, пока я не добавил 'ignore'
:
fix_encoding = lambda s: s.decode('utf8', 'ignore')
Как указано в комментарии ниже, это может привести к нежелательным результатам. OTOH также может просто сделать трюк достаточно хорошо, чтобы заставить все работать, и вы не заботитесь о потере некоторых персонажей.
Ответ 6
Похоже, ваша строка закодирована до 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'
Ответ 7
это работает для ubuntu 15.10:
sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales
Ответ 8
В моем случае это было вызвано сохранением моего файла Unicode с помощью "спецификации". Чтобы решить эту проблему, я взломал файл с помощью BBEdit и сделал "Сохранить как...", выбрав для кодирования "Unicode (UTF-8)", а не то, что он пришел, с которым был "Unicode (UTF-8, с спецификацией)"
Ответ 9
Я получал такую же ошибку, и обнаружил, что консоль не может отображать строку на другом языке. Поэтому я сделал следующие изменения кода, чтобы установить 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 ])
Ответ 10
Попробуйте установить системную по умолчанию кодировку как utf-8
в начале script, чтобы все строки были закодированы с использованием этого.
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Ответ 11
Это лучший ответ:
fooobar.com/questions/11795/...
в linux:
export PYTHONIOENCODING=utf-8
поэтому sys.stdout.encoding
в порядке.
Ответ 12
Я решаю эту проблему, изменяющуюся в файле settings.py с помощью "ENGINE": "django.db.backends.mysql", не используйте "ENGINE": "mysql.connector.django",
Ответ 13
Просто преобразуйте текст в строку с помощью str()
. Работал для меня.