Здравствуйте, Cynic, Вы писали:
C> H>Так все просто. Юникод это BMP (basic multilingual plane, коды 0 — 0xFFFF) и Supplementary (коды 0x10000 — 0x10FFFF) диапазоны. В BMP еще входят два поддиапазона суррогатов (0xD800 — 0xDBFF — старшие суррогаты, 0xDC00 — 0xDFFF — младшие суррогаты). Суррогаты нужны для представления кодпоинтов из диапазона supplementary в кодировке UTF-16. Каждый кодпоинт из supplementary, в UTF-16, будет представлен суррогатной парой — старший суррогат + младший суррогат. Суррогаты сами по себе не являются значимыми юникод-кодпоинтами и их кодировать вообще нельзя, т.е. корректный кодировщик встретив одиночный суррогат должен заменить его замещающим кодпоинтом 0xFFFD; Кодировщик юникода, встретив суррогатную пару, сначала преобразует ее в кодпоинт и только потом этот кодпоинт кодирует.
C> Про суррагатные пары и UTF-16 можно поподробнее? А то то что я читаю, как-то фигово написано не вс1 понял
В UTF-16 без преобразований можно представить только те кодпоинты, которые меньше 65536. Те, что больше должны быть представлены суррогатной парой. Суррогатная пара это два кодпоинта из соответствующих поддиапазонов (выше обозначены). Сначала идет старший суррогат затем младший. Но сами суррогаты при перекодировании, скажем в UTF-8, не кодируются, из них сперва собирается кодпоинт и кодируется уже он.
Пример: кодпоинт 0x20000. Представлен в UTF-16 так: 0xD840:0xDC00, а в UTF-8 так: 0xF0:0xA0:0x80:0x80.