Введение

Кодирование Unicode с переменной шириной, использующее одну или две 16-битовые кодовые единицы. UTF-16 (16-битный формат преобразования Unicode) – это кодировка символов, способная кодировать все 1 112 064 допустимых кодовых точек Unicode (фактически, это количество кодовых точек определяется конструкцией UTF-16). Кодировка имеет переменную длину, так как кодовые точки кодируются одной или двумя 16-битными кодовыми единицами. UTF-16 возник из более ранней устаревшей 16-битной кодировки с фиксированной шириной, теперь известной как UCS-2 (2-байтовый универсальный набор символов), когда стало ясно, что требуется более 216 (65 536) кодовых точек, включая большинство эмодзи и важных символов CJK, таких как имена собственные и географические названия. UTF-16 используется в таких системах, как API Microsoft Windows, язык программирования Java и JavaScript/ECMAScript. Он также иногда используется для файлов обычного текста и текстовых документов в Microsoft Windows. UTF-16 применяется в SMS (стандарт SMS определяет UCS-2, но почти все пользователи фактически реализуют UTF-16, чтобы эмодзи работали). UTF-16 – единственная кодировка (на данный момент), разрешённая в сети Интернет, несовместимая с ASCII и не получившая широкого распространения, где она указана менее чем на 0,004% веб-страниц (и многие из них фактически используют UTF-8, но помечены неверно). Для сравнения, UTF-8 составляет более 98% всех веб-страниц. Рабочая группа WHATWG (Web Hypertext Application Technology Working Group) считает UTF-8 "обязательной кодировкой для всего [текста]" и рекомендует браузерным приложениям не использовать UTF-16 из соображений безопасности.

История

В конце 1980-х годов началась работа над созданием единой кодировки для "Универсального набора символов" (UCS), призванной заменить более ранние, специфичные для языков кодировки, единой согласованной системой. Целью было включить все необходимые символы из большинства языков мира, а также символы из различных технических областей, таких как наука, математика и музыка. Изначальная идея заключалась в замене типичных кодировок, использующих 256 символов и требующих 1 байт на символ, кодировкой, использующей 65 536 (216) значений, что потребовало бы 2 байта (16 бит) на символ. Две группы работали над этим параллельно: ISO/IEC JTC 1/SC 2 и Консорциум Unicode, последний представлял преимущественно производителей вычислительной техники. Обе группы стремились синхронизировать присвоение символам кодов, чтобы разрабатываемые кодировки были взаимосовместимы. Ранняя 2-байтная кодировка первоначально называлась "Unicode", но теперь называется "UCS 2". Когда стало очевидно, что 216 символов будет недостаточно, IEEE предложил более широкое 31-битное пространство и кодировку (UCS 4), требующую 4 байта на символ. Консорциум Unicode воспротивился этому, поскольку 4 байта на символ приводили к значительным затратам памяти и дискового пространства, а также потому, что некоторые производители уже вложили значительные средства в 2-байтную технологию. В качестве компромисса была разработана схема кодирования UTF-16 и представлена в версии 2.0 стандарта Unicode в июле 1996 года. Она полностью описана в RFC 2781, опубликованном в 2000 году IETF. UTF-16 специфицирована в последних версиях международного стандарта ISO/IEC 10646 и стандарта Unicode. "UCS 2 следует считать устаревшей. Она больше не определяет форму кодирования ни в стандарте 10646, ни в стандарте Unicode". (Любая схема, остающаяся самосинхронизирующимся кодом, потребует выделения как минимум одной кодовой точки Базовой многоязычной плоскости (BMP) для начала последовательности. Изменение назначения кодовой точки недопустимо.)

Описание

Каждая кодовая точка Unicode кодируется одним или двумя 16-битными кодовыми блоками. Кодовые точки, меньшие 216 ("в BMP"), кодируются одним 16-битным кодовым блоком, равным числовому значению кодовой точки, как это было в более ранней UCS-2. Кодовые точки, большие или равные 216 ("выше BMP"), кодируются с использованием двух 16-битных кодовых блоков. Эти два 16-битных кодовых блока выбираются из суррогатного диапазона UTF-16, который ранее не был назначен символам. Значения в этом диапазоне не используются как символы, и UTF-16 не предоставляет допустимого способа кодировать их как отдельные кодовые точки. Следовательно, поток UTF-16 состоит из отдельных 16-битных кодов, находящихся за пределами суррогатного диапазона, и пар 16-битных значений, находящихся в пределах суррогатного диапазона.

U+0000 - U+D7FF и U+E000 - U+FFFF

И UTF-16, и UCS-2 кодируют кодовые точки в этом диапазоне как отдельные 16-битные кодовые единицы, численно равные соответствующим кодовым точкам. Эти кодовые точки в базовой многоязыковой плоскости (BMP) – единственные, которые могут быть представлены в UCS-2. Начиная с Unicode 9.0, некоторые современные азиатские, ближневосточные и африканские системы письма, не основанные на латинице, выходят за пределы этого диапазона, как и большинство символов эмодзи.