Юникод в Python
В документации Python 2.7 три правила о Unicode описываются следующим образом:
Если кодовая точка равна < 128, ее обозначают соответствующее значение байта.
Если кодовая точка находится между 128 и 0x7ff
, она превращается в два байтовых значения между 128 и 255.
Кодовые точки > 0x7ff
преобразуются в трех- или четырехбайтовые последовательности, где каждый байт последовательности находится между 128 и 255.
Затем я сделал несколько тестов об этом:
>>>> unichr(40960)
u'\ua000'
>>> ord(u'\ua000')
40960
На мой взгляд, 40960 - это кодовая точкa > 0x7ff
, поэтому она должна быть превращена в трех- или четырехбайтовые последовательности, где каждый байт последовательности находится между 128 и 255, но он только превращается в два -bytes, а значение '00' в u '\ a000' меньше 128, не соответствующее указанным выше правилам. Почему?
Что еще, я нашел еще несколько символов Юникода, например u'\u1234'
и т.д. Я обнаружил, что значение ( "12" & "34" ) в нем также меньше 128, но в соответствии с прежде всего, они не должны быть ниже 128. Любые другие теории, которые я потерял?
Спасибо за все ответы.
Ответы
Ответ 1
в документации python2.7 три правила о юникодах описываются следующим образом:
Это описание кодировки UTF-8.
Затем я сделал несколько тестов об этом:
\ua000
- это escape-последовательность, представляющая символ Unicode. a000
представляет собой шестнадцатеричное представление значения числовой кодовой точки. Он не имеет никакого отношения к кодировке UTF-8.
Вы получаете кодировку UTF-8, когда вы явно кодируете строку юникода, используя кодировку UTF-8.
Ответ 2
Ваша цитата, по-видимому, получена из Unicode HOWTO (вы действительно должны были сообщить нам, откуда она взялась, со ссылкой, если это возможно) и описывает UTF -8. Он не утверждает, что именно так Python 2.7 представляет символы Unicode, на самом деле он делает обратное:
Под капотом Python представляет строки Unicode как 16- или 32-битные целые числа, в зависимости от того, как был скомпилирован интерпретатор Python.
Ответ 3
Эти правила применяются только для UTF-8. Python использует UCS-2 или UCS-4 внутри, которые имеют фиксированные размеры.
"Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!)"
... и значение '00' в u '\ a000' меньше 128, не соответствует указанным выше правилам.
Я даже не хочу знать, почему вы думаете, что их можно разделить так...