LINUX.ORG.RU

История изменений

Исправление Virtuos86, (текущая версия) :

Правда не до конца понимаю, что здесь происходит. Буду признателен, если кто-нибудь по полочкам разберет

Надо понять очень простую штуку: внутре Python оперирует Юникодом, для него это родное представление текста. И да, объекты Юникода — это не строки, у строк всегда есть кодировка. Кодировки-шмодировки — это суть способы представления Юникода. Поэтому, чтобы работать в Python с Юникодом, строки нужно раскодировать, этим и занимается метод decode — декодирует из строки в какой-то кодировке в Юникод. Соответственно, чтобы из Юникода получить строку в некой кодировке, используется метод encode, который кодирует последовательность юникодных символов в байты согласно указанной кодовой странице.

'ïàðàìåòðû îòîáðàæåíèÿ êîíêðåòíîãî çíàêà ïî øàáëîíó'.encode('ISO-8859-1').decode('cp1251')
Это какая-то ересь: строку в неизвестной кодировке пытаются кодировать в строку в кодировке ISO-8859-1, что неминуемо закончится фейлом.

Но если предположить, что кто-то невнимательно копипастил и переписать пример как

>>> print u'ïàðàìåòðû îòîáðàæåíèÿ êîíêðåòíîãî çíàêà ïî øàáëîíó'.encode('ISO-8859-1').decode('cp1251')
параметры отображения конкретного знака по шаблону
>>> 
то всё ладно и складно, потому здесь в строку в кодировке ISO-8859-1 кодируется Юникод.

Да, в случае Python 3 и изначальный пример корректен, поскольку в третьем питоне строки — это Юникод объекты, а не последовательности байтов, как в Python 2.

Исходная версия Virtuos86, :

Правда не до конца понимаю, что здесь происходит. Буду признателен, если кто-нибудь по полочкам разберет

Надо понять очень простую штуку: внутре Python оперирует Юникодом, для него это родное представление текста. И да, объекты Юникода — это не строки, у строк всегда есть кодировка. Кодировки-шмодировки — это суть способы представления Юникода. Поэтому, чтобы работать в Python с Юникодом, строки нужно раскодировать, этим и занимается метод decode — декодирует из строки в какой-то кодировке в Юникод. Соответственно, чтобы из Юникода получить строку в некой кодировке, используется метод encode, который кодирует последовательность юникодных символов в байты согласно указанной кодовой странице.

'ïàðàìåòðû îòîáðàæåíèÿ êîíêðåòíîãî çíàêà ïî øàáëîíó'.encode('ISO-8859-1').decode('cp1251')
Это какая-то ересь: строку в неизвестной кодировке пытаются кодировать в строку в кодировке ISO-8859-1.

Но если предположить, что кто-то невнимательно копипастил и переписать пример как

>>> print u'ïàðàìåòðû îòîáðàæåíèÿ êîíêðåòíîãî çíàêà ïî øàáëîíó'.encode('ISO-8859-1').decode('cp1251')
параметры отображения конкретного знака по шаблону
>>> 
то всё ладно и складно, потому здесь в строку в кодировке ISO-8859-1 кодируется Юникод.