python unicode — encode/decode, приведение к строке

Значения объектов типа «string» по умолчанию задается в Python unicode. Приведение к строке требуется обычно для объектов типа bytes. Они получаются при обработке вывода, например, subprocess.

 

 

python unicode — encode/decode

Юникод нужен при работе с символами нескольких языков. Кириллица, буквы греческого алфавита, иероглифы и т.п. не будут передаваться при вводе их через формы обратной связи. Выполнение скрипта будет завершаться ошибкой если не использовать юникод:

 

[Sat Aug 25 04:40:52.573105 2018] [cgid:error] [pid 28564:tid 139992957437696] [client 212.104.87.172:40958] End of script output before headers: add.cgi, referer: http://example.com/page.html
Traceback (most recent call last):
File «/var/www/site/restore.cgi», line 44, in <module>
print («<h2>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0436\u0438\u0434\u0430\u0439\u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 </h2>»)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-12: ordinal not in range(128)

 

Из сообщения об ошибке следует, что кодек ascii не может обрабатывать символы в кодировке, отличной от ASCII. Чтобы работать с этими символами требуется UTF-8.

 

В юникоде символы кодируются и приводятся к виду \uXXXX. Затем обрабатываются скриптом, далее можно выполнить обратное преобразование.

 

Можно использовать два метода (переменная text содержит объект bytes с юникодом):

1)

text.decode('utf-8')

 

2)

str(text, 'utf-8')

Приведение к строке

Определяем переменную

>> text = «русский текст»

 

Переводим значение в юникод

>> text.encode('utf-8')

b'\xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82'

>> encoded = text.encode('utf-8')

 

 

Тип объекта должен быть bytes

> print (type(encoded))

<class 'bytes'>

 

 

Теперь текст можно расшифровать

>> print (encoded.decode('utf-8'))

русский текст