У меня возникают проблемы с кодированием строки в 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)
Ответы:
Это связано с тем, что кодировка вашего терминала не установлена в UTF-8. Вот мой терминал
На моем терминале пример работает с приведенным выше, но если я избавлюсь от
LANG
настройки, он не будет работатьОбратитесь к документации для своего варианта Linux, чтобы узнать, как сделать это изменение постоянным.
источник
sudo apt-get install language-pack-de
илиsudo locale-gen de_DE.UTF-8
(для немецких языков).LC_ALL
, и самое простое значение, которое могло бы ее исправить,C.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'
, что правильно.поэтому ваша проблема должна быть в каком-то другом месте, возможно, если вы попытаетесь что-то с ней сделать, если происходит неявное преобразование (может быть печать, запись в поток ...)
чтобы сказать больше, нам понадобится код.
источник
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
.string
является utf8 кодировке. если вы его распечатаете, он просто отправит байты в выходной поток, и если ваш терминал не интерпретирует его как utf8, вы получите мусор. сdecode
конвертированием его в юникод, то вы можетеencode
снова кодированию ваш терминал понимает.Мой +1 к комментарию Маты на https://stackoverflow.com/a/10561979/1346705 и к демонстрации Ника Крейга-Вуда. Вы правильно расшифровали строку. Проблема заключается в
print
команде, поскольку она преобразует строку Unicode в кодировку консоли, а консоль не может отображать строку. Попробуйте записать строку в файл и посмотреть результат с помощью какого-нибудь приличного редактора, поддерживающего Unicode:Тогда вы увидите
(。・ω・。)ノ
.источник
Если вы работаете на удаленном хосте, посмотрите
/etc/ssh/ssh_config
на свой локальный компьютер.Когда этот файл содержит строку:
закомментируйте это, добавив
#
в начало строки. Это может помочь.С помощью этой строки
ssh
отправляет на удаленный хост переменные среды вашего ПК, связанные с языком . Это вызывает массу проблем.источник
Попробуйте установить системную кодировку по умолчанию, как
utf-8
в начале скрипта, чтобы все строки кодировались с ее использованием.источник
Как предложил Андрей Красуцкий, можно использовать приведенный ниже код в верхней части сценария .
Но я предлагаю вам также добавить
# -*- coding: utf-8 -*
строку в самом верху скрипта.Пропуск этого вызывает ошибку ниже в моем случае, когда я пытаюсь выполнить
basic.py
.Ниже приведен код, в
basic.py
котором возникает указанная выше ошибка.код с ошибкой
Затем я добавил
# -*- coding: utf-8 -*-
строку в самом верху и выполнил. Это сработало.код без ошибок
Спасибо.
источник
#coding: utf-8
а не# -*- coding: utf-8 -*-
это. Готово к работе с Python PEP 263 - Определение кодировок исходного кода Python .С моим терминалом проблем нет. Приведенные выше ответы помогли мне найти правильное направление, но у меня ничего не вышло, пока я не добавил
'ignore'
:Как указано в комментарии ниже, это может привести к нежелательным результатам. OTOH, он также может достаточно хорошо справиться с задачей, чтобы все работало, и вас не волнует потеря некоторых персонажей.
источник
это работает для ubuntu 15.10:
источник
Похоже, ваша строка закодирована
utf-8
, так в чем именно проблема? Или что ты здесь делаешь ..?источник
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
, я хочу, чтобы она правильно кодировалась.В моем случае это было вызвано тем, что мой файл Unicode сохранялся с "BOM". Чтобы решить эту проблему, я взломал файл с помощью BBEdit и сделал «Сохранить как ...», выбрав для кодирования «Unicode (UTF-8)», а не то, с чем он был, «Unicode (UTF-8, с BOM)» "
источник
Я получал ошибку того же типа и обнаружил, что консоль не может отображать строку на другом языке. Поэтому я внес следующие изменения кода, чтобы установить default_charset как UTF-8.
источник
Это лучший ответ: https://stackoverflow.com/a/4027726/2159089
в Linux:
так
sys.stdout.encoding
хорошо.источник
BOM, это так часто для меня BOM
vi файл, используйте
и сохраните его. Это почти всегда исправляет это в моем случае
источник
У меня была такая же ошибка с URL-адресами, содержащими символы, отличные от ascii (байты со значениями> 128)
Сработало для меня, в Python 2.7, я полагаю, это назначение изменило «что-то» во
str
внутреннем представлении - то есть оно заставляет правильно декодировать поддерживаемую последовательность байтовurl
и, наконец, помещает строку в utf-8str
со всей магией в в нужном месте. Unicode в Python для меня - черная магия. Надеюсь полезноисточник
Я решаю эту проблему, изменяя в файле settings.py с помощью 'ENGINE': 'django.db.backends.mysql', не используйте 'ENGINE': 'mysql.connector.django',
источник
Просто преобразуйте текст в строку с помощью
str()
. Работал у меня.источник