Меня смущает шестнадцатеричное представление Unicode. У меня есть пример файла с одним символом математического интеграла. Это U + 222B. Если я копирую файл или редактирую его в vi, я получаю отображаемый знак интеграла. Шестнадцатеричный дамп файла показывает, что его шестнадцатеричное содержимое равно 88e2 0aab.
В python я могу создать интегральный символ юникода и напечатать p-рендеринг на моем терминале и знаке интеграла.
>>> p=u'\u222b'
>>> p
u'\u222b'
>>> print p
∫
Что меня смущает, так это то, что я могу открыть файл с интегральным знаком, получить интегральный символ, но шестнадцатеричное содержимое другое.
>>> c=open('mycharfile','r').read()
>>> c
'\xe2\x88\xab\n'
>>> print c
∫
Один из них является объектом Unicode, а другой — простой строкой, но какова связь между двумя шестнадцатеричными кодами, по-видимому, для одного и того же символа? Как бы мне вручную конвертировать один в другой?
0x222b
= 8747 — это целое число кода, которое в Юникоде связано со знаком интеграла∫
. когда вы записываете текст в файл или отправляете его по сети, он всегда должен быть сериализован в биты — обычно предпочтительными единицами измерения здесь являются октеты (байты). ряды0xe2
,0x88
,0xab
(или0b11100010
,0b10001000
,0b10101011
в двоичном формате) представляют собой кодировку UTF-8 (en.wikipedia.org/wiki/UTF-8) из0x222b
. между прочим, три начальных1
в первом байте говорят вам, что эта кодовая точка закодирована в трех байтах: UTF-8 имеет как переменную ширину, так и «синхронизацию». - person flow   schedule 11.09.2013