Суррогаты и дополнительные символы

Приложения Windows обычно используют UTF-16 для представления символьных данных Юникода . Использование 16 бит позволяет напрямую представлять 65 536 уникальных символов, но эта базовая многоязычная плоскость (BMP) не достаточно, чтобы охватить все символы, используемые в человеческих языках. Юникод версии 4.1 содержит более 97 000 символов, а более 70 000 символов только для китайского языка.

Стандарт Юникода установил 16 дополнительных "плоскостей" символов, каждый из которых имеет тот же размер, что и BMP. Естественно, большинству кодовых точек за пределами BMP еще не назначены символы, но определение плоскостей дает Юникоду возможность определить 1,114,112 символов (т. е. 216 * 17 символов) в диапазоне кодовых точек от U+0000 до U+10FFFF. Для UTF-16, представляющего этот большой набор символов, стандарт Юникода определяет "дополнительные символы".

Дополнительные символы

Дополнительный символ — это символ, расположенный за пределами BMP, а «суррогат» — значение кода UTF-16. Для UTF-16 "суррогатная пара" требуется для представления одного дополнительного символа. Первый (высокий) суррогат — это 16-битовое значение кода в диапазоне от U+D800 до U+DBFF. Второй (низкий) суррогат — это 16-битовое значение кода в диапазоне от U+DC00 до U+DFFF. С помощью суррогатного механизма UTF-16 может поддерживать все 1 114 112 символов Юникода. Дополнительные сведения о дополнительных символах, суррогатах и суррогатных парах см. в статье Стандарт Юникода.

Примечание

В Windows 2000 реализована поддержка базовых входных, выходных данных и простой сортировки дополнительных символов. Однако не все компоненты системы совместимы с дополнительными символами.

 

Операционная система поддерживает дополнительные символы следующими способами:

  • Формат 12 таблицы cmap шрифта OpenType напрямую поддерживает 4-байтовый код символов. Дополнительные сведения см. в разделе Спецификация шрифта OpenType.
  • Windows поддерживает редакторы методов ввода с поддержкой суррогатов (МЕМ).
  • API Windows GDI поддерживает форматирование 12 таблиц cmap в шрифтах, что позволяет правильно отображать суррогаты.
  • API Uniscribe поддерживает дополнительные символы.
  • Элементы управления Windows, в том числе "Изменить" и "Rich Edit", поддерживают дополнительные символы.
  • Обработчик HTML поддерживает HTML-страницы, которые содержат дополнительные символы для отображения, редактирования (с помощью Outlook Express) и отправки форм.
  • Таблица сортировки операционной системы поддерживает дополнительные символы.

Общие рекомендации по разработке программного обеспечения с использованием дополнительных символов

UTF-16 обрабатывает дополнительные символы как суррогатные пары. Операционная система обрабатывает суррогатную пару так же, как она обрабатывает неиспакционные метки. Во время отображения суррогатная пара отображается в виде одного глифа с помощью Uniscribe, как предписано стандартом Юникода.

В Windows Vista представлены три новых макроса для определения суррогатов и суррогатных пар в строках UTF-16. Это IS_HIGH_SURROGATE, IS_LOW_SURROGATE и IS_SURROGATE_PAIR.

Приложения автоматически поддерживают дополнительные символы, если они поддерживают Юникод, и используют системные элементы управления и стандартные функции API, такие как ExtTextOut и DrawText. Таким образом, если приложение использует стандартные системные элементы управления или общие вызовы типа ExtTextOut для отображения, дополнительные символы должны работать без специального кодирования.

Приложения, реализующие собственную поддержку редактирования путем разработки позиций глифов настраиваемым способом, могут использовать Uniscribe для всей обработки текста. Uniscribe имеет отдельные функции для обработки сложных скриптов, таких как отображение текста, проверка нажатия и перемещение курсора. Приложение должно вызывать функции Uniscribe специально для получения этих расширенных функций. Обратите внимание, что приложения, использующие функции Uniscribe, полностью многоязычны, но это налагает снижение производительности. Таким образом, некоторые приложения должны выполнять собственную обработку дополнительных символов.

Так как суррогатный механизм представления дополнительных символов четко определен, приложение может включать код для обработки суррогатного текста UTF-16. Если приложение обнаруживает отдельное значение UTF-16 от нижнего зарезервированного диапазона суррогатов (низкий суррогат) или верхнего диапазона зарезервированных суррогатов (высокий суррогат), значение должно быть равно одной половине суррогатной пары. Таким образом, приложение может обнаружить суррогатную пару, выполняя простую проверку диапазона. Если он обнаруживает значение UTF-16 в нижнем или верхнем диапазоне, он должен отслеживать одну 16-битовую ширину, чтобы получить остальную часть символа. При написании приложения следует помнить, что CharNext и CharPrev перемещаются по 16-разрядным точкам кода, а не по суррогатным парам.

Примечание

Автономные суррогатные кодовые точки имеют либо высокий суррогат без смежного нижнего суррогата, либо наоборот. Эти кодовые точки недопустимы и не поддерживаются. Их поведение не определено.

 

Если вы разрабатываете поставщик шрифтов или IME, обратите внимание, что операционные системы до Windows XP по умолчанию отключают поддержку дополнительных символов. Windows XP и более поздних версий по умолчанию включает дополнительные символы. Если вы предоставляете шрифт и пакет IME, который требует дополнительных символов, приложение должно задать следующие значения реестра:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack]
SURROGATE=(REG_DWORD)0x00000002

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\42]
IEFixedFontName=[Surrogate Font Face Name]
IEPropFontName=[Surrogate Font Face Name]

Кодировки