Суррогаты и дополнительные символы
Приложения Windows обычно используют UTF-16 для представления символьных данных Юникода символьных данных. Использование 16 бит позволяет напрямую представлять 655 536 уникальных символов, но этот базовый многоязычный плоскость (BMP) почти недостаточно для покрытия всех символов, используемых на человеческих языках. Юникод версии 4.1 включает более 97 000 символов с более чем 70 000 символами для китайского только.
Стандарт Юникод установил 16 дополнительных "плоскостей" символов, каждый из которых совпадает с BMP. Естественно, большинство точек кода за пределами BMP еще не имеют символов, назначенных им, но определение плоскостей дает Юникоду возможность определить 1114 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 может поддерживать все 114 112 потенциальных символов Юникода. Дополнительные сведения о дополнительных символах, суррогатах и суррогатных парах см. в Юникод стандарт.
Примечание
Windows 2000 предоставляет поддержку базовых входных, выходных данных и простой сортировки дополнительных символов. Однако не все системные компоненты совместимы с дополнительными символами.
Операционная система поддерживает дополнительные символы следующим образом:
- Формат 12 таблицы cmap шрифта OpenType напрямую поддерживает 4-байтовый код символа. Дополнительные сведения см. в спецификации шрифта OpenType.
- Windows поддерживает суррогатные редакторы методов ввода (IMEs).
- API Windows GDI поддерживает формат 12 таблиц cmap в шрифтах, чтобы суррогаты отображались правильно.
- API Uniscribe поддерживает дополнительные символы.
- элементы управления Windows, включая изменить и расширенныередактирования, поддерживают дополнительные символы.
- Модуль HTML поддерживает HTML-страницы, включающие дополнительные символы для отображения, редактирования (через Outlook Express) и отправку форм.
- Таблица сортировки операционной системы поддерживает дополнительные символы.
UTF-16 обрабатывает дополнительные символы как суррогатные пары. Операционная система обрабатывает суррогатную пару аналогично тому, как она обрабатывает неспакционные знаки. Во время отображения суррогатная пара отображается как один глиф с помощью Юниписи, как указано в Стандарте Юникода.
Windows Vista представляет три новых макроса, которые помогут определить суррогаты и суррогатные пары в строках UTF-16. Это IS_HIGH_SURROGATE, IS_LOW_SURROGATEи IS_SURROGATE_PAIR.
Приложения автоматически поддерживают дополнительные символы, если они поддерживают Юникод и используют системные элементы управления и стандартные функции API, такие как ExtTextOut и DrawText. Таким образом, если приложение использует стандартные системные элементы управления или использует общие ExtTextOutвызовы типа для отображения, дополнительные символы должны работать без специального написания кода.
Приложения, реализующие собственную поддержку редактирования, путем разработки позиций глифов в настраиваемом режиме могут использовать 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]