В реальном мире строковыми данными обмениваются в какой-то кодировке. Например, koi8-r, cp1251, utf-8. И когда тебе приходят данные, ты во многих случаях знаешь, какая это кодировка. Но когда тебе приезжают данные из разных мест в разных кодировках, работать с ними одновременно довольно напряжно - надо всегда об этом помнить.
Чтоб облегчить жизнь, внутри программ используют юникодные данные - это которые
u'test'
. Их можно получить декодированием обычной строки, типа
'test'.decode('utf-8')
, и точно так же кодированием превратить в обычную
строку: u'test'.encode('utf-8')
.
Юникод - это способ представления, а не хранения данных. Т.е. юникод - это стандарт, который сопоставляет символу какое-то число - те самые \u<номер>. А кодировка - это способ хранения этого числа, например UTF-81 хранит числа таким образом, что символы латиницы (символы с номером меньше 128) кодируются в один байт, и таким образом соответствует ASCII. При этом у кириллицы - двухбайтные символы.
Работа происходит так: ты получаешь какие-то данные от своего окружения, декодируешь их в юникод, работаешь, а когда отдаëшь наружу, опять превращаешь в строку. Наружу - это не только вывод на экран, это и запись в файлы, и в базу данных. Хотя драйверы БД (а тем более ORM) обычно сами преобразуют юникод в нужную кодировку.
Цель этой заметки - всего лишь дать базовое понятие о том, почему в питоне есть отдельный тип для юникодных данных, а для более полного понимания можно почитать разное:
- [The Absolute Minimum … About Unicode …][4] - классика от Джоэля
- [Repeat after me: Unicode is not UTF-\d{1,2}][3] - много текста про то, что Unicode и UTF-xx - разные вещи
- [русскую][1] википедию
- [английскую][2] википедию