Значения объектов типа 'string' по умолчанию задается в Python unicode. Приведение к строке требуется обычно для объектов типа bytes.
Они получаются при обработке вывода, например, subprocess.
Методы python unicode — encode/decode
Юникод нужен при работе с символами нескольких языков. Кириллица, буквы греческого алфавита, иероглифы и т.п. не будут передаваться при вводе их через формы обратной связи.
Выполнение скрипта будет завершаться ошибкой если не использовать юникод:
[Sat Aug 25 04:40:52.573105 2018] [cgid:error] [pid 28564:tid 139992957437696] [client 123.123.123.123: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\u0635 \u043e\u0442\u043f\u0440\u0430\\u0435\u043d\u043e. \u041f\u043e\u0436\u0430\u043b\u0443\u0479\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'))
русский текст
Читайте также про метод join в python, он позволяет объединить элементы в строку.