Подтвердить что ты не робот

Unicode против UTF-8 путаницы в Python/Django?

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

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

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

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

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

4b9b3361

Ответ 1

что такое "строка 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 использовать термин "Юникод", что означает, в частности, кодировку UTF-16LE, которую NT использует внутренне. Люди из Microsoftland часто могут копировать эту несколько вводящую в заблуждение привычку.

Ответ 2

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

Ответ 3

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

Ответ 4

Из Википедия в UTF-8:

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

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

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

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

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

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

Ответ 5

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

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