Re[3]: Преобразование символов в UTF-8 ?
От: hattab  
Дата: 22.03.11 16:20
Оценка: 3 (1)
Здравствуйте, Cynic, Вы писали:

C> H>Во-вторых, приведенная последовательность (237, 160, 130) некорректна т.к. после байта-маркера начала последовательности (ED) должен следовать байт со значением в диапазоне 80 — 9F (128 — 159).


C> Символ с кодом 0xEDA082 имеет двоичное представление 11101101 10100000 10000010, что соответствует кодировке UTF-8. Кроме того после ED следует код A0, который лежит в указанном вами диапазоне 80 — 9F.


A0 — это 160, а диапазон от 128 до 159 включительно. Кстати, U+D802 это вообще старший суррогат, и он сам по себе закодирован быть не может.

C> Правда я не понимаю почему байт после байта маркера должен иметь значения именно в диапазоне 80 — 9F, т.к. если учесть, что этот байт кодируется как 10xxxxxx, то он может принимать значения от 10000000 до 10111111, т.е. диапазон будет 80-BF.


Потому что так сказано в спецификации UTF-8. Там даются пояснения. Насколько я помню, это связано с однозначностью декодирования и в целях безопасности.

C> H>В-третьих нет ничего удивительно в том, что GetChars для одного юникод-кодпоинта вернет два символа т.к. supplementary-диапазон юникода ( > FFFF) представляется в UTF-16 (а виндовый юникод всегда представлен в UTF-16) в виде суррогатной пары.


C> Вот тут поподробнее я ни чего не понял


Так все просто. Юникод это BMP (basic multilingual plane, коды 0 — 0xFFFF) и Supplementary (коды 0x10000 — 0x10FFFF) диапазоны. В BMP еще входят два поддиапазона суррогатов (0xD800 — 0xDBFF — старшие суррогаты, 0xDC00 — 0xDFFF — младшие суррогаты). Суррогаты нужны для представления кодпоинтов из диапазона supplementary в кодировке UTF-16. Каждый кодпоинт из supplementary, в UTF-16, будет представлен суррогатной парой — старший суррогат + младший суррогат. Суррогаты сами по себе не являются значимыми юникод-кодпоинтами и их кодировать вообще нельзя, т.е. корректный кодировщик встретив одиночный суррогат должен заменить его замещающим кодпоинтом 0xFFFD; Кодировщик юникода, встретив суррогатную пару, сначала преобразует ее в кодпоинт и только потом этот кодпоинт кодирует.
avalon 1.0rc3 rev 380, zlib 1.2.3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.