Юникод в 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, не соответствует указанным выше правилам.

Я даже не хочу знать, почему вы думаете, что их можно разделить так...