Итак, я решил просто обернуть этот вопрос и опубликовать ответы на математические вопросы, которые я не понял, прежде чем получить тонну мудрости от SO.
Первый вопрос касался "é"который дает "\xc3\xa9"
при кодировании с utf8 и где ord("é")
возвращает 233
.Ясно, что 233 не было суммой 195 (десятичное представление c3) и 169 (то же самое для a9).Так что же происходит?
"é" имеет соответствующую точку Unicode U+00E9
.Десятичное значение для шестнадцатеричного числа e9
равно 233. Так вот что такое ord("é")
.
Так как же это закончится как "\xc3\xa9"
?
As Jörg W Mittagобъяснено и продемонстрировано, что в utf8 все не-ASCII "закодированы как многооктетная последовательность" .
Двоичное представление 233 равно 11101001
.Поскольку это не ASCII, его необходимо упаковать в двухоктетную последовательность, которая в соответствии с Йоргом будет следовать этому шаблону:
110xxxxx 10xxxxxx
(110 и 10 фиксированы, оставляя место для пяти битов в первом октетеи шесть бит во втором - всего 11).
Таким образом, 8-битное двоичное представление 233 вставляется в этот шаблон, заменяя xx-части ... Так как доступно 11 битов, и нам нужно только 8 битов, мы дополняем 8 битов еще 3, 000
, (т.е. 00011101001
).
^^^00011 ^^101001
(000
, за которым следует наше 8-битное представление 233)
11000011 10101001
(двоичное представление 233, вставленное впоследовательность октетов)
11000011
равно гексу c3
, поскольку 10101001
равно a9
, что другими словами соответствует исходной последовательности "\xc3\xa9"
Аналогичное пошаговое руководство длясимвол "Ĭ":
'Ĭ'.encode('utf-8')
возвращает b'\xc4\xac'
.И ord('Ĭ')
равно 300.
Итак, снова точка Unicode для этого символа - U+012C
, которая имеет десятичное значение 300 ((1 * 16 * 16) + (2 * 16 * 1) + (12 * 1)) - так что это орд-часть.
Опять двоичное представление 300 составляет 9 бит, 100101100
.Итак, еще раз необходимо двухоктетную последовательность шаблона 110xxxxx 10xxxxxx
.И снова мы дополняем его парой 0
, поэтому достигаем 11 бит (00100101100
).
^^^00100 ^^101100
(00
, за которым следует наше 9-битное представление 300)
11000100 10101100
(двоичное представление 300, вставленное в две октетные последовательности).
11000100
соответствует c4
в шестнадцатеричном формате, 10101100
до ac
- другими словами b'\xc4\xac'
.
Спасибо всем за помощь в этом.Я многому научился.