Строка в питоне с моим юникодом? - PullRequest
8 голосов
/ 26 марта 2011
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> str_version = 'នយោបាយ'
>>> type(str_version)
<class 'str'>
>>> print (str_version)
នយោបាយ
>>> unicode_version = 'នយោបាយ'.decode('utf-8')
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    unicode_version = 'នយោបាយ'.decode('utf-8')
AttributeError: 'str' object has no attribute 'decode'
>>> 

В чем проблема с моей строкой Unicode?

Ответы [ 3 ]

10 голосов
/ 27 марта 2011

Нет ничего плохого в вашей строке! Вы только что перепутали encode() и decode(). Строка имеет смысл символов. Чтобы превратить его в байты, которые могут быть сохранены в файле или переданы через Интернет, используйте encode() с кодировкой , например, UTF-8. Каждое кодирование является схемой для преобразования значимых символов в простые байты вывода.

Когда придет время сделать обратное - взять несколько необработанных байтов из файла или сокета и превратить их в символы, такие как буквы и цифры, - вы расшифруете байтов, используя метод decode() байтовых строк в Python 3.

>>> str_version = 'នយោបាយ'
>>> str_version.encode('utf-8')
b'\xe1\x9e\x93\xe1\x9e\x99\xe1\x9f\x84\xe1\x9e\x94\xe1\x9e\xb6\xe1\x9e\x99'

Видите эту большую длинную строку байтов? Это те байты, которые UTF-8 использует для представления вашей строки, если вам нужно передать строку по сети или сохранить их в документе. Есть много других используемых кодировок, но это, кажется, самое популярное. Каждая кодировка может превращать значащие символы, такие как ន и យោ, в байты - маленькие 8-битные числа, с которыми общаются компьютеры.

>>> rawbytes = str_version.encode('utf-8')
>>> rawbytes
b'\xe1\x9e\x93\xe1\x9e\x99\xe1\x9f\x84\xe1\x9e\x94\xe1\x9e\xb6\xe1\x9e\x99'
>>> rawbytes.decode('utf-8')
'នយោបាយ'
7 голосов
/ 27 марта 2011

Вы читаете документы 2.x. str.decode()bytes.encode()) было сброшено в 3.x. И str уже является строкой Unicode; его не нужно декодировать.

3 голосов
/ 27 марта 2011

У вас уже есть строка Unicode. В Python 3 str - это строки Unicode (unicode в Python 2.x), а однобайтовые строки (Python 2.x str) больше не считаются текстовыми, теперь они называются bytes. Последний может быть преобразован в str с помощью метода decode, но первый уже декодирован - вы можете только кодировать его обратно в bytes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...