Вопрос

Я наткнулся на этот отрывок в Учебник по Джанго:

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

От Википедия в UTF-8:

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

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

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

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

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

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

Так что же такое «строка Unicode» в Python?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top