Почему str.encode ('ascii') не работает для этого случая? - PullRequest
1 голос
/ 17 января 2012
In [1]: str='美'

In [2]: str.encode('utf-8')
Out[2]: b'\xe7\xbe\x8e'

In [3]: str.encode('utf-16')
Out[3]: b'\xff\xfe\x8e\x7f'

In [4]: str.encode('ascii')
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
/Users/XXXuserXXXTemp/<ipython-input-4-c7b96e3e54a7> in <module>()
----> 1 str.encode('ascii')

UnicodeEncodeError: 'ascii' codec can't encode character '\u7f8e' in position 0: ordinal not in range(128)

str - это китайский / японский символ.

  • почему ascii не работает?

  • как понять Out [2] и Out [3], т.е. что они на самом деле?

Ответы [ 4 ]

5 голосов
/ 17 января 2012

Почему ascii не работает?

str='美' не является символом ASCII, он находится вне диапазона ASCII и поэтому не может быть представлен как символ ASCII.

Из учебника Unicode для python :

Кодировки не должны обрабатывать все возможные символы Unicode, и большинство кодировок этого не делают.Например, кодировка Python по умолчанию - это кодировка 'ascii'.Правила для преобразования строки Unicode в кодировку ASCII просты;для каждой кодовой точки:

  1. Если кодовая точка <128, каждый байт совпадает со значением кодовой точки. </p>

  2. Если кодовая точка 128 или больше, строка Unicode не может быть представлена ​​в этой кодировке.(В этом случае Python вызывает исключение UnicodeEncodeError.)


как понять Out[2] и Out[3], т. Е. Что они на самом делеare?

Это байтовые строки (не символьные).Out[2] - это последовательность байтов, которая представляет кодовую точку в единицах кода UTF-8.Обозначение \xe7 означает байт с шестнадцатеричным значением e7.Out[3] - это последовательность байтов, которая представляет кодовую точку в единицах кода UTF-16.

Чтобы понять разницу между символами, байтами и единицами кода, внимательно и полностью прочитайте учебник Unicode для python .Для другого, довольно хорошего, обращения с тем же материалом, прочитайте * 1048 Джоэла Спольски * Абсолютный минимум каждый разработчик программного обеспечения, абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!) .Ты должен знать это много, никаких оправданий!

4 голосов
/ 17 января 2012
  • ASCII не содержит ханзи / кандзи, поэтому нет действительного способа его кодирования.

  • Они кодируются текст .

2 голосов
/ 17 января 2012

Вы не можете закодировать этот символ в ascii, потому что он не является частью символов, которые могут быть представлены с помощью ascii.

Out[2] и Out[3] - двоичное представление вашего персонажа в utf-8 и utf-16.

2 голосов
/ 17 января 2012

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

http://www.asciitable.com/

В основном, только основные символы в ascii - это английский алфавит и некоторые знаки препинания / специальные символы.

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