Unicode против UTF-8 путаница в Python / Django? - PullRequest
30 голосов
/ 22 августа 2008

Я наткнулся на этот отрывок в учебнике Django :

Модели Django имеют метод по умолчанию str (), который вызывает unicode () и преобразует результат в строку байтов UTF-8. Это означает, что unicode (p) вернет строку Unicode, а str (p) вернет нормальную строку с символами, закодированными как UTF-8.

Теперь я запутался, потому что afaik Unicode не является каким-то конкретным представлением, так что же такое "строка Unicode" в Python? Означает ли это UCS-2? Googling обнаружил это "Учебник по Python Unicode" , в котором смело говорится

Unicode - это двухбайтовая кодировка, охватывающая все распространенные в мире системы записи.

что не так или нет? Меня много раз сбивали с толку набор символов и проблемы с кодировкой, но здесь я совершенно уверен, что документация, которую я читаю, запутана. Кто-нибудь знает, что происходит в Python, когда он дает мне «строку Unicode»?

Ответы [ 5 ]

48 голосов
/ 07 февраля 2009

что такое "строка Unicode" в Python? Означает ли это UCS-2?

Строки Unicode в Python хранятся внутри UCS-2 (16-битное представление фиксированной длины, почти такое же, как UTF-16) или UCS-4 / UTF-32 (32-битное представление фиксированной длины). Это опция времени компиляции; в Windows это всегда UTF-16, в то время как многие дистрибутивы Linux устанавливают UTF-32 («широкий режим») для своих версий Python.

Как правило, вас это не должно волновать: вы будете видеть кодовые точки Unicode как отдельные элементы в своих строках и не будете знать, хранятся ли они как два или четыре байта. Если вы находитесь в сборке UTF-16 и вам нужно обрабатывать символы вне базовой многоязычной плоскости, вы будете делать это неправильно, но это все еще очень редко, и пользователи, которым действительно нужны дополнительные символы, должны компилировать широкие сборки.

прямо не так, или это?

Да, это совершенно неправильно. Честно говоря, я думаю, что учебник довольно старый; вероятно, он предшествует широким строкам Unicode, если не Unicode 3.1 (версия, которая вводит символы вне базовой многоязычной плоскости).

Существует еще один источник путаницы, вытекающий из привычки Windows использовать термин «Unicode» для обозначения, в частности, кодировки UTF-16LE, которую NT использует для внутреннего использования. Люди из Microsoftland могут часто копировать эту несколько вводящую в заблуждение привычку.

8 голосов
/ 22 августа 2008

Тем временем я провел изысканное исследование, чтобы проверить, что такое внутреннее представление в Python, а также каковы его пределы. « Правда о Unicode в Python » - очень хорошая статья, которая цитируется непосредственно разработчиками Python. По-видимому, внутренним представлением является UCS-2 или UCS-4 в зависимости от переключателя времени компиляции. Итак, Джон, это не UTF-16, но твой ответ в любом случае поставил меня на правильный путь, спасибо.

0 голосов
/ 22 августа 2008

С Википедия по UTF-8 :

UTF-8 (8-битный формат преобразования UCS / Unicode) - это кодировка символов переменной длины для Unicode. Он может представлять любой символ в стандарте Unicode , однако первоначальное кодирование байтовых кодов и назначений символов для UTF-8 обратно совместимо с ASCII. По этим причинам он постоянно становится предпочтительной кодировкой для электронной почты, веб-страниц [1] и других мест, где символы хранятся или передаются в потоковом режиме.

Таким образом, это может быть от одного до четырех байтов в зависимости от того, какой символ вы хотите представить в области Unicode.

Из Википедии о Юникоде:

В области вычислительной техники Unicode является отраслевым стандартом, позволяющим компьютерам последовательно представлять и манипулировать текстом, выраженным в большинстве мировых систем письма .

Таким образом, он может представлять большинство (но не все) мировых систем письма.

Надеюсь, это поможет:)

0 голосов
/ 22 августа 2008

так что же такое "строка Unicode" в Python?

Python "знает", что ваша строка - Unicode. Следовательно, если вы сделаете регулярное выражение, он будет знать, какой персонаж, а какой нет и т.д., что действительно полезно. Если вы сделали strlen, это также даст правильный результат. Например, если вы подсчитали число строк в Hello, вы получите 5 (даже если это Unicode). Но если вы подсчитали количество иностранных слов, и эта строка не была строкой Юникода, вы получите гораздо больший результат. Pythong использует информацию из базы данных символов Unicode для идентификации каждого символа в строке Unicode. Надеюсь, это поможет.

0 голосов
/ 22 августа 2008

Python сохраняет Unicode как UTF-16. str () вернет UTF-8 представление строки UTF-16.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...