solovyov.net

Юникод в Python 2.x - что это и зачем?

В реальном мире строковыми данными обмениваются в какой-то кодировке. Например, koi8-r, cp1251, utf-8. И когда тебе приходят данные, ты во многих случаях знаешь, какая это кодировка. Но когда тебе приезжают данные из разных мест в разных кодировках, работать с ними одновременно довольно напряжно - надо всегда об этом помнить.

Чтоб облегчить жизнь, внутри программ используют юникодные данные - это которые u'test'. Их можно получить декодированием обычной строки, типа 'test'.decode('utf-8'), и точно так же кодированием превратить в обычную строку: u'test'.encode('utf-8').

Юникод - это способ представления, а не хранения данных. Т.е. юникод - это стандарт, который сопоставляет символу какое-то число - те самые \u<номер>. А кодировка - это способ хранения этого числа, например UTF-81 хранит числа таким образом, что символы латиницы (символы с номером меньше 128) кодируются в один байт, и таким образом соответствует ASCII. При этом у кириллицы - двухбайтные символы.

Работа происходит так: ты получаешь какие-то данные от своего окружения, декодируешь их в юникод, работаешь, а когда отдаëшь наружу, опять превращаешь в строку. Наружу - это не только вывод на экран, это и запись в файлы, и в базу данных. Хотя драйверы БД (а тем более ORM) обычно сами преобразуют юникод в нужную кодировку.

Цель этой заметки - всего лишь дать базовое понятие о том, почему в питоне есть отдельный тип для юникодных данных, а для более полного понимания можно почитать разное:


  1. Unicode Transformation Format