У меня возникли некоторые проблемы при попытке закодировать строку в UTF-8. Я пробовал множество способов, включая использование string.encode('utf-8')
и unicode(string)
, но получаю ошибку:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1: ordinal not in range(128)
Вот моя строка:
(。・ω・。)ノ
Я не понимаю, что идет не так, есть идеи?
Edit: Проблема в том, что печать строки как она есть не отображается должным образом. Также, эта ошибка, когда я пытаюсь преобразовать ее:
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. Вот мой терминал
$ 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')
gives u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, which is correct.
Так что ваша проблема должна быть в другом месте, возможно, если вы пытаетесь сделать что-то с ним, где происходит неявное преобразование (может быть печать, запись в поток...)
Чтобы сказать больше, нам нужно увидеть код.
Мой +1 до мата'ы комментировать https://stackoverflow.com/a/10561979/1346705 и Ник Крейг-Вуд'с демонстрацией. Вы правильно расшифровали строку. Проблема с команду печать
как он преобразует строку в кодировке Юникод в кодировку консоли, и консоль не способна отобразить строку. Попробуйте написать строку в файл и посмотреть на результат через некоторое приличный редактор, который поддерживает 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()
Тогда вы увидите (。・ω・。)ノ
.
Попробуйте установить по умолчанию система кодирования в качестве UTF-8
в начале скрипта, так что все строки кодируются с использованием.
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Если вы работаете на удаленных хоста, посмотрите на файл/etc/СШ/файле ssh_config на местных ПК.
Когда этот файл содержит строку:
SendEnv LANG LC_*
закомментируйте его с добавлением #
во главе линии. Это могло бы помочь.
С этой линией, СШ
посылает соответствующие языковые переменные среды вашего ПК для удаленного * хост. Его причины много проблемы.
Никаких проблем с моего терминала. Ответов не помог мне, глядя в правильном направлении, но это не't работа для меня, пока я добавил 'игнор'
:
fix_encoding = lambda s: s.decode('utf8', 'ignore')
Как указано в комментарии ниже, это может привести к нежелательным результатам. Ото оно также может просто делать свое дело достаточно хорошо, чтобы получить вещи работать и вы не'т заботятся о потере некоторых персонажей.
Это's прекрасно, чтобы использовать ниже код в верхней части вашего скрипта, как Андрей Krasutski предложил.
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Но я предлагаю вам также добавить # -*- кодирование: UTF-8 -*
линия в самом верху скрипта.
Пропустив его бросает ниже ошибка в моем случае, когда я пытаюсь выполнить basic.py
.
$ python basic.py
File "01_basic.py", line 14
SyntaxError: Non-ASCII character '\xd9' in file basic.py on line 14, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
Ниже приводится настоящего Кодекса в basic.py который выбрасывает сообщение об ошибке выше.
from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def fill_document(doc):
with doc.create(Section('ِش سثؤفهخى')):
doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))
with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')
if __name__ == '__main__':
# Basic document
doc = Document('basic')
fill_document(doc)
Затем я добавил `# -- кодирование: UTF-8 --линия на самом верху и казнен. Он работал.
# -*- coding: utf-8 -*-
from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def fill_document(doc):
with doc.create(Section('ِش سثؤفهخى')):
doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))
with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')
if __name__ == '__main__':
# Basic document
doc = Document('basic')
fill_document(doc)
Спасибо.
Похоже, что ваша строка закодирована в 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'
В моем случае, он был вызван мой файл в кодировке Юникод, сохраненного С А "ОМБ" по. Чтобы решить эту проблему, я открыл файл с помощью BBEdit и сделал и"Сохранить как..." и выбирают кодирование на "Юникод (UTF-8)" и не то, что он пришел с, который был на "Юникод (UTF-8, с BOM), то"
Я получаю тот же тип ошибки, и я обнаружил, что консоль не способна отображать строку на другом языке. Отсюда я сделал ниже код, чтобы установить 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 ])
У меня была такая же ошибка, с URL-адреса, содержащие не-ASCII символы (байты со значениями > 128)
url = url.decode('utf8').encode('utf-8')
Работал для меня в Python 2.7, я полагаю, что это назначение изменило 'что-то' в ул
внутреннее представление, т. е. его силами право декодирование сохраненных байт последовательности в URL
и, наконец, добавляет строку в поддержка UTF-8 стр
с магией в нужном месте.
Unicode в Python-это черная магия для меня.
Надеюсь, пригодится
Это самый лучший ответ: https://stackoverflow.com/a/4027726/2159089
в Linux:
export PYTHONIOENCODING=utf-8
так `в sys.поток stdout.кодирование-это нормально.
Просто преобразовать текст прямо в строку, используя (ул.)
. Работал для меня.
я решить эту проблему не меняя в файле settings.py с 'двигатель': 'Джанго.дБ.бэкэндов.в MySQL' Дон´t использовать 'двигатель': 'базы данных MySQL.разъем.Джанго',