python может кодировать utf-8, но не может декодировать

Код ниже может кодировать строку в Utf-8:

#!/usr/bin/python # -*- coding: utf-8 -*- str = 'ورود' print(str.encode('utf-8')) 

Что печатает:

 b'\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf' 

Но я не могу декодировать эту строку с помощью этого кода:

 #!/usr/bin/python # -*- coding: utf-8 -*- str = b'\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf' print(str.decode('utf-8')) 

Ошибка:

 Traceback (most recent call last): File "C:\test.py", line 5, in <module> print(str.decode('utf-8')) AttributeError: 'str' object has no attribute 'decode' 

Пожалуйста помогите …

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

Из ответов, переключенных на байтовую строку:

 #!/usr/bin/python # -*- coding: utf-8 -*- str = b'\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf' print(str.decode('utf-8')) 

Теперь ошибка:

 Traceback (most recent call last): File "C:\test.py", line 5, in <module> print(str.decode('utf-8')) File "C:\Python34\lib\encodings\cp437.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-3: character maps to <undefined> 

  • Как преобразовать файл в utf-8 в Python?
  • Проверьте правильность строки utf8 в Python
  • Файл CSV Python 3, предоставляющий UnicodeDecodeError: кодек «utf-8» не может декодировать ошибку байта при печати
  • Sublime Text 3, Python 3 и UTF-8 не любят друг друга
  • Кто-нибудь смог написать символы UTF-8 с помощью xlwt python?
  • Возврат строчной строки ASCII из (возможно, кодированной) строки, извлеченной с использованием urllib2 или BeautifulSoup
  • Создать список из строки с правильной кодировкой (UTF-8)
  • ElementTree и unicode
  • 3 Solutions collect form web for “python может кодировать utf-8, но не может декодировать”

    Похоже, вы используете Python 3.X. Вы .encode() Unicode строки ( u'xxx' или 'xxx' ). Вы .decode() байтовые строки b'xxxx' .

     #!/usr/bin/python # -*- coding: utf-8 -*- s = b'\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf' # ^ # Need a 'b' # print(s.decode('utf-8')) 

    Обратите внимание, что ваш терминал может не отображать строку Unicode. Консоль Windows Mine:

     Python 3.3.5 (v3.3.5:62cf4e77f785, Mar 9 2014, 10:35:05) [MSC v.1600 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> s = b'\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf' >>> # ^ ... # Need a 'b' ... # ... print(s.decode('utf-8')) Traceback (most recent call last): File "<stdin>", line 4, in <module> File "D:\dev\Python33x64\lib\encodings\cp437.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-3: character maps to <undefined> 

    Но он делает декодирование. '\uxxxx' представляет собой кодовую точку Unicode.

     >>> s.decode('utf-8') '\u0648\u0631\u0648\u062f' 

    Моя среда разработки PythonWin поддерживает UTF-8 и может отображать символы:

     >>> s = b'\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf' >>> print(s.decode('utf-8')) ورود 

    Вы также можете записать данные в файл и отобразить его в редакторе, который поддерживает UTF-8, например, «Блокнот». так как ваша исходная строка уже UTF-8, просто напишите ее в файл непосредственно в виде байтов. 'wb' открывает файл в двоичном режиме, а байты записываются так:

     >>> with open('out.txt','wb') as f: ... f.write(s) 

    Если у вас есть строка Unicode, вы можете написать ее как UTF-8 с помощью:

     >>> with open('out.txt','w',encoding='utf8') as f: ... f.write(u) # assuming "u" is already a decoded Unicode string. 

    PS str – это встроенный тип. Не используйте его для имен переменных.

    Python 2.x работает по-разному. 'xxxx' является байтовой строкой, а u'xxxx' является строкой Unicode, но вы все равно .encode() строка Unicode и .decode() строка байта.

    Используйте следующий код:

     str = b'\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf' print(str.decode('utf-8')) 

    Python имеет тип unicode первого класса, который можно использовать вместо простого типа strtestring str. Это легко, если вы согласны с необходимостью явного преобразования между байтом и строкой Unicode:

     >>> persian_enter = unicode('\xd9\x88\xd8\xb1\xd9\x88\xd8\xaf', 'utf8') >>> print persian_enter ورود 

    Python 2 имел две глобальные функции, чтобы принуждать объекты к строкам: unicode (), чтобы принудить их к строкам Unicode и str (), чтобы принудить их к строкам, отличным от Unicode. Python 3 имеет только один строковый тип, строки Unicode , поэтому функция str () – это все, что вам нужно. (Функция unicode () больше не существует.)

    подробнее о чтении и записи данных в Юникоде

    Interesting Posts

    Самая быстрая метрика расстояния в пути в python

    Ipython работает в командной строке, но не в браузере

    Инвертировать ось в matplotlib grafic

    Итерация над словарями с использованием циклов 'for'

    Передача self.var (атрибут экземпляра) в качестве параметра метода по умолчанию

    Pandas – конвертировать строки вовремя без даты

    Метод PIL open () не работает с BytesIO

    Верните первый элемент в список, соответствующий условию

    Boxplot: цвета по значению x и оттенки, дифференцированные по шаблону

    Сгенерировать временную последовательность с шагом 7 секунд

    Как найти перекресток списка?

    Почему я получаю сообщение об ошибке «соединение отказалось» в Python? (Розетки)

    Существуют ли встроенные функции, блокирующие операции ввода-вывода, которые не позволяют запускать другие потоки?

    Проблема сборки Matplotlib: ошибка C1083: невозможно открыть файл include: 'ft2build.h'

    Выводить изображения в html с помощью python

    Python - лучший язык программирования в мире.