<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=UTF-16</id>
	<title>UTF-16 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=UTF-16"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=UTF-16&amp;action=history"/>
	<updated>2026-07-16T09:47:42Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=UTF-16&amp;diff=40583&amp;oldid=prev</id>
		<title>imported&gt;Alex NB OT: унификация языковых шаблонов</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=UTF-16&amp;diff=40583&amp;oldid=prev"/>
		<updated>2025-11-15T11:10:31Z</updated>

		<summary type="html">&lt;p&gt;унификация языковых шаблонов&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;UTF-16&amp;#039;&amp;#039;&amp;#039; ({{lang-en|Unicode Transformation Format, 16-bit}}) в [[Информатика|информатике]] — метод [[сериализация|сериализации]] юникодного текста (то есть последовательности &amp;#039;&amp;#039;кодовых позиций&amp;#039;&amp;#039; [[Юникод]]а) в последовательность 16-[[бит]]ных слов.&lt;br /&gt;
&lt;br /&gt;
Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством {{число|1112064}}). При этом каждый символ записывается одним или двумя словами (последнее называется &amp;#039;&amp;#039;&amp;#039;суррогатная пара&amp;#039;&amp;#039;&amp;#039;). Кодировка UTF-16 описана в приложении Q к международному стандарту [[ISO/IEC 10646]], а также ей посвящён IETF RFC 2781 «UTF-16, an encoding of ISO 10646».&lt;br /&gt;
&lt;br /&gt;
С появлением UTF-16 название &amp;#039;&amp;#039;&amp;#039;UCS-2&amp;#039;&amp;#039;&amp;#039; (универсальная двухбайтовая кодировка) &amp;#039;&amp;#039;&amp;#039;устарело&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== История появления ==&lt;br /&gt;
Первая версия Юникода (1991 г.) представляла собой 16-битную кодировку с фиксированной шириной символа; общее число разных символов было 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt; ({{число|65536}}). Во второй версии Юникода (1996 г.) было решено значительно расширить кодовую область; для сохранения совместимости с теми системами, где уже был реализован 16-битный Юникод, и была создана UTF-16. Область 0xD800—0xDFFF, отведённая для суррогатных пар, ранее принадлежала к области «символов для частного использования».&lt;br /&gt;
&lt;br /&gt;
Поскольку в UTF-16 можно отобразить {{math|2&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;+2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;−2&amp;lt;sup&amp;gt;11&amp;lt;/sup&amp;gt;}} ({{число|1112064}}) символов, то это число и было выбрано в качестве новой величины кодового пространства Юникода.&lt;br /&gt;
&lt;br /&gt;
== Принцип кодирования ==&lt;br /&gt;
{| align=&amp;quot;right&amp;quot; class=&amp;quot;standard&amp;quot; style=&amp;quot;margin-left: 20px&amp;quot; cellpadding=&amp;quot;8&amp;quot;&lt;br /&gt;
 | &lt;br /&gt;
 !&amp;lt;font color=&amp;quot;#0070ff&amp;quot;&amp;gt;DC00&amp;lt;/font&amp;gt;&lt;br /&gt;
 !…&lt;br /&gt;
 !&amp;lt;font color=&amp;quot;#0070ff&amp;quot;&amp;gt;DFFE&amp;lt;/font&amp;gt;&lt;br /&gt;
 !&amp;lt;font color=&amp;quot;#0070ff&amp;quot;&amp;gt;DFFF&amp;lt;/font&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 !&amp;lt;font color=&amp;quot;#ff7000&amp;quot;&amp;gt;D800&amp;lt;/font&amp;gt;&lt;br /&gt;
 |010000||…||0103FE||0103FF&lt;br /&gt;
 |-&lt;br /&gt;
 !&amp;lt;font color=&amp;quot;#ff7000&amp;quot;&amp;gt;D801&amp;lt;/font&amp;gt;&lt;br /&gt;
 |010400||…||0107FE||0107FF&lt;br /&gt;
 |-&lt;br /&gt;
 !…&lt;br /&gt;
 | colspan=4 align=&amp;quot;center&amp;quot; |…&lt;br /&gt;
 |-&lt;br /&gt;
 !&amp;lt;font color=&amp;quot;#ff7000&amp;quot;&amp;gt;DBFF&amp;lt;/font&amp;gt;&lt;br /&gt;
 |10FC00||…||10FFFE&lt;br /&gt;
 | bgcolor=&amp;quot;#666666&amp;quot; |&amp;amp;nbsp;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от 0 до FFFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;).&lt;br /&gt;
При этом можно кодировать символы Unicode в диапазонах 0000&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..D7FF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; и E000&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..FFFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;.&lt;br /&gt;
Исключенный отсюда диапазон D800&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..DFFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16-битными словами.&lt;br /&gt;
&lt;br /&gt;
Символы Unicode до FFFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; включительно (исключая диапазон для суррогатов) записываются как есть 16-битным словом.&lt;br /&gt;
&lt;br /&gt;
Символы же в диапазоне 10000&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..10FFFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; (больше 16 бит) кодируются по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
* Из кода символа вычитается 10000&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. В результате получится значение от нуля до FFFFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;, которое помещается в разрядную сетку 20 бит.&lt;br /&gt;
&lt;br /&gt;
* Старшие 10 бит (число в диапазоне 0000&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..03FF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;) суммируются с D800&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;, и результат идёт в ведущее (первое) слово, которое входит в диапазон &amp;lt;span style=&amp;quot;color:#00AA00;&amp;quot;&amp;gt;D800&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..DBFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Младшие 10 бит (тоже число в диапазоне 0000&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..03FF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;) суммируются с DC00&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;, и результат идёт в последующее (второе) слово, которое входит в диапазон &amp;lt;span style=&amp;quot;color:#0070FF;&amp;quot;&amp;gt;DC00&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;..DFFF&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Порядок байтов ==&lt;br /&gt;
&amp;lt;!-- Название раздела используется для перенаправлений --&amp;gt;&lt;br /&gt;
Один символ кодировки UTF-16 представлен последовательностью двух байтов или двух пар байтов.&lt;br /&gt;
Который из двух байтов идёт впереди, старший или младший, зависит от [[порядок байтов|порядка байтов]].&lt;br /&gt;
Систему, совместимую с процессорами [[x86]], называют {{lang-en2|[[порядок байтов|little endian]]}}, а с процессорами [[m68k]] и [[SPARC]] — {{lang-en2|[[порядок байтов|big endian]]}}.&lt;br /&gt;
&lt;br /&gt;
Для определения порядка байтов используется [[Byte order mark|метка порядка байтов]] ({{lang-en|Byte order mark}}). В начале текста записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов обратный (little endian), поскольку код U+FFFE в Юникоде не кодирует символ и зарезервирован как раз для целей определения порядка байтов. Так как в кодировке UTF-8 не используются значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий различать UTF-16 и UTF-8.&lt;br /&gt;
&lt;br /&gt;
=== UTF-16LE и UTF-16BE ===&lt;br /&gt;
Предусмотрена также возможность внешнего указания порядка байтов — для этого кодировка должна быть описана как &amp;#039;&amp;#039;&amp;#039;UTF-16LE&amp;#039;&amp;#039;&amp;#039; или &amp;#039;&amp;#039;&amp;#039;UTF-16BE&amp;#039;&amp;#039;&amp;#039; (little-endian / big-endian), а не просто UTF-16. В этом случае метка порядка байтов (U+FEFF) не нужна.&lt;br /&gt;
&lt;br /&gt;
== UTF-16 в ОС Windows ==&lt;br /&gt;
{{main|Юникод в операционных системах Microsoft}}&lt;br /&gt;
В [[Интерфейс программирования приложений|API]] [[Win32]], распространённом в современных версиях операционной системы [[Microsoft Windows]], имеется два способа представления текста: в форме традиционных 8-битных [[кодовая страница|кодовых страниц]] и в виде UTF-16.&lt;br /&gt;
&lt;br /&gt;
При использовании UTF-16, Windows не накладывает ограничений на прикладные программы касательно кодирования текстовых файлов, позволяя им использовать как UTF-16LE, так и UTF-16BE посредством установки и трактовки соответствующей [[Маркер последовательности байтов|метки порядка байтов]]. Однако внутренний формат Windows — всегда UTF-16LE. Этот момент следует учитывать при работе с [[Portable Executable|исполняемыми файлами]], использующими юникодовые версии функций WinAPI. Строки в них всегда кодируются в UTF-16LE&amp;lt;ref&amp;gt;{{Cite web |url=https://msdn.microsoft.com/en-us/library/windows/desktop/dd374101(v=vs.85).aspx |title=Using Byte Order Marks|lang=en|access-date=2016-02-18 |archive-date=2016-01-22 |archive-url=https://web.archive.org/web/20160122202803/https://msdn.microsoft.com/en-us/library/windows/desktop/dd374101(v=vs.85).aspx |url-status=live }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В [[файловая система|файловых системах]] [[NTFS]], а также [[File Allocation Table|FAT]] с поддержкой длинных имён, [[имя файла|имена файлов]] записываются также в UTF-16LE.&lt;br /&gt;
&lt;br /&gt;
== Примеры процедур ==&lt;br /&gt;
Примеры ниже записаны на псевдокоде и в них не учитывается маска порядка байтов — они лишь показывают суть кодирования.&lt;br /&gt;
Порядок байтов — от младшего к старшему (Little-Endian, интеловский x86).&lt;br /&gt;
Тип &amp;lt;code&amp;gt;Word&amp;lt;/code&amp;gt; — двухбайтовое слово (16-битное беззнаковое целое), а тип &amp;lt;code&amp;gt;UInt32&amp;lt;/code&amp;gt; — 32-битное беззнаковое целое.&lt;br /&gt;
Шестнадцатеричные значения начинаются со знака доллара «$».&lt;br /&gt;
&lt;br /&gt;
=== Кодирование ===&lt;br /&gt;
В примере &amp;lt;code&amp;gt;WriteWord()&amp;lt;/code&amp;gt; — условная процедура, которая пишет одно слово (при этом сдвигает внутренний указатель).&lt;br /&gt;
Функция &amp;lt;code&amp;gt;LoWord()&amp;lt;/code&amp;gt; возвращает младшее слово от 32-битного целого (старшие биты, не глядя, отбрасываются).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
// Допустимые значения Code: $0000..$D7FF, $E000..$10FFFF.&lt;br /&gt;
Procedure WriteUTF16Char(Code: UInt32)&lt;br /&gt;
    If (Code &amp;lt; $10000) Then&lt;br /&gt;
        WriteWord(LoWord(Code))&lt;br /&gt;
    Else&lt;br /&gt;
        Code = Code - $10000&lt;br /&gt;
        Var Lo10: Word = LoWord(Code And $3FF)&lt;br /&gt;
        Var Hi10: Word = LoWord(Code Shr 10)&lt;br /&gt;
        WriteWord($D800 Or Hi10)&lt;br /&gt;
        WriteWord($DC00 Or Lo10)&lt;br /&gt;
    End If&lt;br /&gt;
End Procedure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Декодирование ===&lt;br /&gt;
В примере &amp;lt;code&amp;gt;ReadWord()&amp;lt;/code&amp;gt; читает слово из потока (сдвигая при этом внутренний указатель).&lt;br /&gt;
Она же при необходимости может корректировать порядок байтов.&lt;br /&gt;
Функция &amp;lt;code&amp;gt;WordToUInt32&amp;lt;/code&amp;gt; расширяет двухбайтовое слово до четырёхбайтового беззнакового целого, заполняя старшие биты нулями.&lt;br /&gt;
&amp;lt;code&amp;gt;Error()&amp;lt;/code&amp;gt; прерывает выполнение (по сути [[Обработка исключений|исключение]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
// В случае успеха возвращаются значения&lt;br /&gt;
// в диапазонах $0000..$D7FF и $E000..$10FFFF.&lt;br /&gt;
Function ReadUTF16Char: UInt32&lt;br /&gt;
    Var Leading:  Word  // Лидирующее (первое) слово.&lt;br /&gt;
    Var Trailing: Word  // Последующее (второе) слово.&lt;br /&gt;
&lt;br /&gt;
    Leading = ReadWord();&lt;br /&gt;
    If (Leading &amp;lt; $D800) Or (Leading &amp;gt; $DFFF) Then&lt;br /&gt;
        Return WordToUInt32(Leading)&lt;br /&gt;
    Else If (Leading &amp;gt;= $DC00) Then&lt;br /&gt;
        Error(&amp;quot;Недопустимая кодовая последовательность.&amp;quot;)&lt;br /&gt;
    Else&lt;br /&gt;
        Var Code: UInt32&lt;br /&gt;
        Code = WordToUInt32(Leading And $3FF) Shl 10&lt;br /&gt;
        Trailing = ReadWord()&lt;br /&gt;
        If ((Trailing &amp;lt; $DC00) Or (Trailing &amp;gt; $DFFF)) Then&lt;br /&gt;
            Error(&amp;quot;Недопустимая кодовая последовательность.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
            Code = Code Or WordToUInt32(Trailing And $3FF)&lt;br /&gt;
            Return (Code + $10000)&lt;br /&gt;
        End If&lt;br /&gt;
    End If&lt;br /&gt;
End Function&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://www.unicode.org/notes/tn12/ Unicode Technical Note #12: Обработка UTF-16]{{ref|en}}&lt;br /&gt;
* [http://www.unicode.org/faq/utf_bom.html#utf16-11 Unicode FAQ: В чём разница между UCS-2 и UTF-16?]{{ref|en}}&lt;br /&gt;
* {{Inet-note-ref|type=rfc|id=2781|text=RFC 2781: UTF-16, an encoding of ISO 10646}}{{ref|en}}&lt;br /&gt;
* [http://www.unicode.org/ Полное описание стандарта Unicode]{{ref|en}}&lt;br /&gt;
* [http://www.cl.cam.ac.uk/~mgk25/ucs/ISO-10646-UTF-16.html ISO-10646-UTF-16 (Информация о конвертировании больших значений в два слова UTF-16)]{{ref|en}}&lt;br /&gt;
&lt;br /&gt;
{{Кодировки символов}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Юникод]]&lt;br /&gt;
[[Категория:Компьютерные кодировки]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Alex NB OT</name></author>
	</entry>
</feed>