Вопрос по unicode, python – UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xef в позиции 1

95

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

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1: ordinal not in range(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)
Это просто нормально вставленная строка. То же самое происходит, когда я просто пытаюсь распечатать его. Markum
Я встречаю то же самое при установке pip и исправляю это отсюда: [install some devel] [1] [1]:stackoverflow.com/questions/17931726/… BollMose

Ваш Ответ

16   ответов
-2

«django.db.backends.mysql», не использую «ENGINE»: «mysql.connector.django»,

Error: User Rate Limit ExceededagainstError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

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

Error: User Rate Limit Exceeded
-1

https://stackoverflow.com/a/4027726/2159089

в Linux:

export PYTHONIOENCODING=utf-8

такsys.stdout.encoding все в порядке.

0

что консоль не может отображать строку на другом языке. Поэтому я сделал следующие изменения кода, чтобы установить 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 ])
-2

str(), Работал на меня.

-1

с URL, содержащими символы не ascii (байты со значениями & gt; 128)

url = url.decode('utf8').encode('utf-8')

Работая для меня, в Python 2.7, я полагаю, это назначение изменило «что-то» вstr внутреннее представление - то есть оно вызывает правильное декодирование последовательности байтов вurl и, наконец, помещает строку вutf-8 str со всей магией в нужном месте. Unicode в Python для меня черная магия. Надеюсь, полезно

24

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', что правильно.

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

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

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89' Markum
Error: User Rate Limit ExceededstringError: User Rate Limit ExceededdecodeError: User Rate Limit ExceededencodeError: User Rate Limit Exceeded
Error: User Rate Limit Exceededrepr(string)
Error: User Rate Limit ExceededUnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined> Markum
Error: User Rate Limit Exceeded(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë. Markum
1

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'
Error: User Rate Limit Exceeded(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ëError: User Rate Limit Exceeded Markum
1

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

Андрей Красуцкий предложил.

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Но я предлагаю вам также добавить# -*- coding: 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 который выдает ошибку выше.

code with error
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)

Потом я добавил# -*- coding: utf-8 -*- линия на самом верху и выполнена. Это сработало.

code without error
# -*- 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)

Благодарю.

Error: User Rate Limit Exceeded#coding: utf-8Error: User Rate Limit Exceeded# -*- coding: utf-8 -*-Error: User Rate Limit ExceededPEP 263 -- Defining Python Source Code Encodings.
69

что код вашего терминала не установлен в 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, чтобы узнать, как сделать это изменение постоянным.

Error: User Rate Limit Exceededsudo apt-get install language-pack-deError: User Rate Limit Exceededsudo locale-gen de_DE.UTF-8Error: User Rate Limit Exceeded
7

utf-8 в начале скрипта, так что все строки кодируются с использованием этого.

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Error: User Rate Limit Exceeded
0

vi файл, используйте

:set nobomb

и сохрани это. Это почти всегда исправляет это в моем случае

20

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()

Тогда вы увидите(。・ω・。)ノ.

8

remote хозяин, посмотри на/etc/ssh/ssh_config на вашеlocal ПК.

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

SendEnv LANG LC_*

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

С этой линиейssh отправляет переменные среды вашего компьютера на языкremote хост. Это приводитa lot of проблемы.

4

мотреть в правильных направлениях, но они не работали для меня, пока я не добавил'ignore':

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы