Сведения о вопросе

LARVION

07:28, 18th August, 2020

Теги

python   django   unicode    

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

Просмотров: 480   Ответов: 5

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

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

Теперь я в замешательстве, потому что, насколько мне известно, Unicode-это не какая-то конкретная представленность, так что "Unicode string" в Python? Означает ли это UCS-2? В гугле появился этот "Python Unicode Tutorial" , который смело заявляет:

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

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



  Сведения об ответе

davran

14:55, 1st August, 2020

что такое "Unicode string" в 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 могут часто копировать эту несколько вводящую в заблуждение привычку.


  Сведения об ответе

LAST

04:28, 14th August, 2020

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


  Сведения об ответе

PROGA

08:29, 25th August, 2020

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


  Сведения об ответе

padenie

08:01, 24th August, 2020

Из Википедии на UTF-8 :

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

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

Из Википедии на Unicode:

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

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

Я надеюсь, что это поможет :)


  Сведения об ответе

SSESION

12:16, 13th August, 2020

так что же такое a "Unicode string" в Python?

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться