<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/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://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=UTF-16"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=UTF-16&amp;action=history"/>
	<updated>2026-07-06T01:44:25Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=UTF-16&amp;diff=57128&amp;oldid=prev</id>
		<title>imported&gt;黎景 来自 2026年2月8日 (日) 09:37</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=UTF-16&amp;diff=57128&amp;oldid=prev"/>
		<updated>2026-02-08T09:37:26Z</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;{{NoteTA&lt;br /&gt;
|G1 = IT&lt;br /&gt;
|1 = zh-hans:代码; zh-hant:代碼;&lt;br /&gt;
}}&lt;br /&gt;
{{CJK-New-Char|2A6A5|24B62}}&lt;br /&gt;
{{SpecialChars}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;UTF-16&amp;#039;&amp;#039;&amp;#039;是[[Unicode]][[字符编码#现代编码模型|字符编码五层次模型]]的第三层：字符编码表（Character Encoding Form，也称为&amp;quot;storage format&amp;quot;）的一种实现方式。即把Unicode字符集的抽象[[码位]]映射为16位长的整数（即[[码元]]）的-{序列}-，用于数据存储或传递。Unicode字符的码位，需要1个或者2个16位长的码元来表示，因此这是一个变长表示。&lt;br /&gt;
&lt;br /&gt;
UTF是&amp;quot;Unicode/UCS Transformation Format&amp;quot;的首字母缩写，即把Unicode字符转换为某種格式之意。UTF-16正式定義於[[ISO 10646|ISO/IEC 10646-1]]的附錄C，而[[RFC]]2781也定義了相似的做法。&lt;br /&gt;
&lt;br /&gt;
== UTF-16描述 ==&lt;br /&gt;
Unicode的编码空间从U+0000到U+10FFFF，共有1,112,064个码位（code point）可用来映射字符。Unicode的编码空间可以划分为17个平面（plane），每个平面包含2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;（65,536）个码位。17个平面的码位可表示为从U+xx0000到U+xxFFFF，其中xx表示十六进制值从00&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;到10&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;，共计17个平面。第一个平面称为&amp;#039;&amp;#039;&amp;#039;基本多语言平面&amp;#039;&amp;#039;&amp;#039;（Basic Multilingual Plane, &amp;#039;&amp;#039;&amp;#039;BMP&amp;#039;&amp;#039;&amp;#039;），或稱第零平面（Plane 0），其他平面称为&amp;#039;&amp;#039;&amp;#039;辅助平面&amp;#039;&amp;#039;&amp;#039;（Supplementary Planes）。基本多语言平面內，從U+D800到U+DFFF之間的码位區段是永久保留不映射到Unicode字符。UTF-16就利用保留下来的0xD800-0xDFFF区段的码位來對輔助平面的字符的码位進行編碼。&lt;br /&gt;
&lt;br /&gt;
=== 从U+0000至U+D7FF以及从U+E000至U+FFFF的码位 ===&lt;br /&gt;
第一个Unicode平面（码位从U+0000至U+FFFF）包含了最常用的字符。该平面被称为基本多语言平面，缩写为&amp;#039;&amp;#039;BMP&amp;#039;&amp;#039;（Basic Multilingual Plane，BMP）。UTF-16与[[UCS-2]]编码这个范围内的码位为16比特长的单个码元，数值等价于对应的码位。BMP中的这些码位是仅有的可以在UCS-2中表示的码位。&lt;br /&gt;
&lt;br /&gt;
=== 从U+10000到U+10FFFF的码位 ===&lt;br /&gt;
辅助平面（Supplementary Planes）中的码位，在UTF-16中被编码为&amp;#039;&amp;#039;&amp;#039;一对&amp;#039;&amp;#039;&amp;#039;16比特长的码元（即32位元，4字節），称作&amp;#039;&amp;#039;代理对&amp;#039;&amp;#039;（Surrogate Pair），具体方法是：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center&amp;quot; align=&amp;quot;right&amp;quot;&lt;br /&gt;
 |+ UTF-16解碼&lt;br /&gt;
 |&amp;lt;font color=#FF7000&amp;gt;lead&amp;lt;/font&amp;gt; \ &amp;lt;font color=#0070FF&amp;gt;trail&amp;lt;/font&amp;gt;&lt;br /&gt;
 !&amp;lt;font color=#0070FF&amp;gt;DC00&amp;lt;/font&amp;gt;&lt;br /&gt;
 !&amp;lt;font color=#0070FF&amp;gt;DC01&amp;lt;/font&amp;gt;&lt;br /&gt;
 !&amp;lt;font color=#0070FF&amp;gt;   …   &amp;lt;/font&amp;gt;&lt;br /&gt;
 !&amp;lt;font color=#0070FF&amp;gt;DFFF&amp;lt;/font&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 !&amp;lt;font color=#FF7000&amp;gt;D800&amp;lt;/font&amp;gt;&lt;br /&gt;
 |10000||10001||…||103FF&lt;br /&gt;
 |-&lt;br /&gt;
 !&amp;lt;font color=#FF7000&amp;gt;D801&amp;lt;/font&amp;gt;&lt;br /&gt;
 |10400||10401||…||107FF&lt;br /&gt;
 |-align=&amp;quot;center&amp;quot;&lt;br /&gt;
 !&amp;lt;font color=#FF7000&amp;gt;  ⋮&amp;lt;/font&amp;gt;&lt;br /&gt;
 |⋮||⋮||⋱||⋮&lt;br /&gt;
 |-&lt;br /&gt;
 !&amp;lt;font color=#FF7000&amp;gt;DBFF&amp;lt;/font&amp;gt;&lt;br /&gt;
 |10FC00||10FC01||…||10FFFF&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
# 码位减去 &amp;lt;code&amp;gt;0x10000&amp;lt;/code&amp;gt;，得到的值的范围为20比特长的 &amp;lt;code&amp;gt;0...0xFFFFF&amp;lt;/code&amp;gt;。&lt;br /&gt;
# 高位的10比特的值（值的范围为 &amp;lt;code&amp;gt;0...0x3FF&amp;lt;/code&amp;gt;）被加上 &amp;lt;code&amp;gt;0xD800&amp;lt;/code&amp;gt; 得到第一个码元或称作高位代理（high surrogate），值的范围是 &amp;lt;code&amp;gt;0xD800...0xDBFF&amp;lt;/code&amp;gt;。由于高位代理比低位代理的值要小，所以为了避免混淆使用，Unicode标准现在称高位代理为&amp;#039;&amp;#039;&amp;#039;前导代理&amp;#039;&amp;#039;&amp;#039;（lead surrogates）。&lt;br /&gt;
# 低位的10比特的值（值的范围也是 &amp;lt;code&amp;gt;0...0x3FF&amp;lt;/code&amp;gt;）被加上 &amp;lt;code&amp;gt;0xDC00&amp;lt;/code&amp;gt; 得到第二个码元或称作低位代理（low surrogate），现在值的范围是 &amp;lt;code&amp;gt;0xDC00...0xDFFF&amp;lt;/code&amp;gt;。由于低位代理比高位代理的值要大，所以为了避免混淆使用，Unicode标准现在称低位代理为&amp;#039;&amp;#039;&amp;#039;后尾代理&amp;#039;&amp;#039;&amp;#039;（trail surrogates）。&lt;br /&gt;
&lt;br /&gt;
上述算法可理解为：辅助平面中的码位从U+10000到U+10FFFF，共计FFFFF个，即2&amp;lt;sup&amp;gt;20&amp;lt;/sup&amp;gt;=1,048,576个，需要20位来表示。如果用两个16位长的整数组成的-{序列}-来表示，第一个整数（称为前导代理）要容纳上述20位的前10位，第二个整数（称为后尾代理）容纳上述20位的后10位。还要能根据16位整数的值直接判明属于前导整数代理的值的范围（2&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;=1024)，还是后尾整数代理的值的范围（也是2&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;=1024）。因此，需要在基本多语言平面中保留不对应于Unicode字符的2048个码位，就足以容纳前导代理与后尾代理所需要的编码空间。这对于基本多语言平面总计65536个码位来说，仅占3.125%。&lt;br /&gt;
&lt;br /&gt;
由于前导代理、后尾代理、BMP中的有效字符的码位，三者互不重叠，搜索是简单的：一个字符编码的一部分不可能与另一个字符编码的不同部分相重叠。这意味着UTF-16是自同步（self-synchronizing）的：可以通过仅检查一个码元来判定给定字符的下一个字符的起始码元。[[UTF-8]]也有类似优点，但许多早期的编码模式就不是这样，必须从头开始分析文本才能确定不同字符的码元的边界。&lt;br /&gt;
&lt;br /&gt;
由于最常有的字符都在基本多文种平面中，许多软件处理代理对的部分往往得不到充分的测试。这导致了一些长期的bug与潜在安全漏洞，它们甚至存在于广为流行且评价颇高的应用软件中&amp;lt;ref&amp;gt;{{cite web|url=http://www.google.com/codesearch/p?hl=en&amp;amp;sa=N&amp;amp;cd=3&amp;amp;ct=rc#WiHOcNHN_BU/xalan-j_2_7_0/src/org/apache/xalan/lib/ExsltStrings.java&amp;amp;q=file:ExsltStrings\.java%20align|title=Code in Apache Xalan 2.7.0 which can fail on surrogate pairs|quote=The code wrongly assumes it is safe to use &amp;lt;code&amp;gt;substring&amp;lt;/code&amp;gt; on the input|publisher=Apache Foundation|access-date=2012-03-23|archive-date=2011-04-23|archive-url=https://web.archive.org/web/20110423214254/http://www.google.com/codesearch/p?hl=en&amp;amp;sa=N&amp;amp;cd=3&amp;amp;ct=rc#WiHOcNHN_BU/xalan-j_2_7_0/src/org/apache/xalan/lib/ExsltStrings.java&amp;amp;q=file:ExsltStrings\.java%20align|dead-url=no}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
=== 从U+D800到U+DFFF的码位 ===&lt;br /&gt;
Unicode标准规定U+D800...U+DFFF的值不对应于任何字符。&lt;br /&gt;
&lt;br /&gt;
但是在使用UCS-2的时代，U+D800...U+DFFF内的值被占用，用于某些字符的映射。但只要不构成代理对，许多UTF-16编码解码还是能把这些不符合Unicode标准的字符映射正确的辨识、转换成合规的码元&amp;lt;ref&amp;gt; Python 2.6 decode of UTF16 does this on Linux, and it correctly handles surrogate pairs. All &amp;quot;CESU&amp;quot; decoders do it too, though they also mistranslate correct surrogate pairs into 2 characters&amp;lt;/ref&amp;gt;。按照Unicode标准，这种码元序列本来应算作编码错误。&lt;br /&gt;
&lt;br /&gt;
=== 範例：===&lt;br /&gt;
以U+10437编码（𐐷）为例:&lt;br /&gt;
# &amp;lt;code&amp;gt;0x10437&amp;lt;/code&amp;gt; 减去 &amp;lt;code&amp;gt;0x10000&amp;lt;/code&amp;gt;，结果为&amp;lt;code&amp;gt;0x00437&amp;lt;/code&amp;gt;，二进制为 &amp;lt;code&amp;gt;{{Font color|#00AA00|0000 0000 01}}{{Font color|#0070FF|00 0011 0111}}&amp;lt;/code&amp;gt;&lt;br /&gt;
# 分割它的上10位值和下10位值（使用二进制）：&amp;lt;code&amp;gt;{{Font color|#00AA00|0000 0000 01}}&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;{{Font color|#0070FF|00 0011 0111}}&amp;lt;/code&amp;gt;&lt;br /&gt;
# 添加 &amp;lt;code&amp;gt;0xD800&amp;lt;/code&amp;gt; 到上值，以形成{{Font color|#00AA00|高位}}：&amp;lt;code&amp;gt;0xD800 + 0x0001 = {{Font color|#00AA00|0xD801}}&amp;lt;/code&amp;gt;&lt;br /&gt;
# 添加 &amp;lt;code&amp;gt;0xDC00&amp;lt;/code&amp;gt; 到下值，以形成{{Font color|#0070FF|低位}}：&amp;lt;code&amp;gt;0xDC00 + 0x0037 = {{Font color|#0070FF|0xDC37}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* 下表总结了一起示例的转换过程，颜色指示码点位如何分布在所述的UTF-16中。由UTF-16编码过程中加入附加位的以黑色显示。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=2|字符&lt;br /&gt;
! 普通[[二进制]]&lt;br /&gt;
! UTF-16[[二进制]]&lt;br /&gt;
! UTF-16 [[十六进制]]&amp;lt;br&amp;gt;字符代码&lt;br /&gt;
! UTF-16BE&amp;lt;br&amp;gt;[[十六进制]][[字节]]&lt;br /&gt;
! UTF-16LE&amp;lt;br&amp;gt;[[十六进制]][[字节]]&lt;br /&gt;
|-&lt;br /&gt;
|[[$]] || &amp;lt;code&amp;gt;U+0024&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|0000 0000 0010 0100}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|0000 0000 0010 0100}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|0024}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|00 24}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|24 00}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[€]]|| &amp;lt;code&amp;gt;U+20AC&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|0010 0000 1010 1100}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|0010 0000 1010 1100}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|20AC}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|20 AC}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#0070FF|AC 20}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[𐐷]] || &amp;lt;code&amp;gt;U+10437&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|0001 0000 01}}{{Font color|#0070FF|00 0011 0111}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;1101 10{{Font color|#00AA00|00 0000 0001}} 1101 11{{Font color|#0070FF|00 0011 0111}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|D801}} {{Font color|#0070FF|DC37}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|D8 01}} {{Font color|#0070FF|DC 37}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|01 D8}} {{Font color|#0070FF|37 DC}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|𤭢 || &amp;lt;code&amp;gt;U+24B62&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|0010 0100 10}}{{Font color|#0070FF|11 0110 0010}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;1101 10{{Font color|#00AA00|00 0101 0010}} 1101 11{{Font color|#0070FF|11 0110 0010}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|D852}} {{Font color|#0070FF|DF62}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|D8 52}} {{Font color|#0070FF|DF 62}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|align=right|&amp;lt;code&amp;gt;{{Font color|#00AA00|52 D8}} {{Font color|#0070FF|62 DF}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 範例：UTF-16編碼程序 ===&lt;br /&gt;
假設要將U+64321（16進位）轉成UTF-16編碼。因為它超過U+FFFF，所以他必須編譯成32位元（4個byte）的格式，如下所示：&lt;br /&gt;
&lt;br /&gt;
 V = 0x64321&lt;br /&gt;
 Vx = V - 0x10000&lt;br /&gt;
 = 0x54321&lt;br /&gt;
 = 0101 0100 0011 0010 0001&lt;br /&gt;
 &lt;br /&gt;
 Vh = 01 0101 0000 // Vx的高位部份的10 bits&lt;br /&gt;
 Vl = 11 0010 0001 // Vx的低位部份的10 bits&lt;br /&gt;
 w1 = 0xD800 //結果的前16位元初始值&lt;br /&gt;
 w2 = 0xDC00 //結果的後16位元初始值&lt;br /&gt;
 &lt;br /&gt;
 w1 = w1 | Vh&lt;br /&gt;
 = 1101 1000 0000 0000&lt;br /&gt;
  |       01 0101 0000&lt;br /&gt;
 = 1101 1001 0101 0000&lt;br /&gt;
 = 0xD950&lt;br /&gt;
 &lt;br /&gt;
 w2 = w2 | Vl&lt;br /&gt;
 = 1101 1100 0000 0000&lt;br /&gt;
  |       11 0010 0001&lt;br /&gt;
 = 1101 1111 0010 0001&lt;br /&gt;
 = 0xDF21&lt;br /&gt;
&lt;br /&gt;
所以這個字U+64321最後正確的UTF-16編碼應該是：&lt;br /&gt;
 0xD950 0xDF21&lt;br /&gt;
而在小尾序中最后的编码应该是：&lt;br /&gt;
 0x50D9 0x21DF&lt;br /&gt;
&lt;br /&gt;
因為這個字超過U+FFFF所以無法用UCS-2的格式編碼。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 16進制編碼範圍 !! UTF-16表示方法（二進制）!! 10進制碼範圍 !! 字節數量&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U+0000&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;U+FFFF&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;xxxx xxxx xxxx xxxx&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;yyyy yyyy yyyy yyyy&amp;lt;/code&amp;gt;|| 0-65535 || 2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U+10000&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;U+10FFFF&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1101 10yy yyyy yyyy&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;1101 11xx xxxx xxxx&amp;lt;/code&amp;gt; || 65536-1114111 || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UTF-16比起[[UTF-8]]，好處在於大部分字符都以固定長度的字節（2字節）儲存，但UTF-16卻無法相容於[[ASCII]]編碼。&lt;br /&gt;
&lt;br /&gt;
== UTF-16的編碼模式 ==&lt;br /&gt;
UTF-16的大尾序和小尾序儲存形式都在用。一般來說，以[[Macintosh]]製作或儲存的文字使用大尾序格式，以[[Microsoft]]或[[Linux]]製作或儲存的文字使用小尾序格式。&lt;br /&gt;
&lt;br /&gt;
為了弄清楚UTF-16文件的大小尾序，在UTF-16文件的開首，都會放置一個U+FEFF字符作為[[位元組順序記號|Byte Order Mark]]（UTF-16 LE以 &amp;lt;code&amp;gt;FF FE&amp;lt;/code&amp;gt; 代表，UTF-16 BE以 &amp;lt;code&amp;gt;FE FF&amp;lt;/code&amp;gt; 代表），以顯示這個文字檔案是以UTF-16編碼，其中U+FEFF字符在UNICODE中代表的意義是 &amp;lt;code&amp;gt;ZERO WIDTH NO-BREAK SPACE&amp;lt;/code&amp;gt;，顧名思義，它是個沒有寬度也沒有斷字的空白。&lt;br /&gt;
&lt;br /&gt;
以下的例子有四個字符：「朱」（U+6731）、半角逗號（U+002C）、「聿」（U+807F）、「{{僻字|𪚥|四個「-{龍}-」字，以「田」字形佈局}}」（U+2A6A5）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;7&amp;quot; | 使用UTF-16編碼的例子&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | 編碼名稱&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | 編碼次序&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | 編碼&lt;br /&gt;
|-&lt;br /&gt;
! BOM&lt;br /&gt;
! 朱&lt;br /&gt;
! ,&lt;br /&gt;
! 聿&lt;br /&gt;
! {{僻字|𪚥|四個「-{龍}-」字}}&lt;br /&gt;
|-&lt;br /&gt;
| UTF-16 LE&lt;br /&gt;
| 小尾序，不含BOM&lt;br /&gt;
|&lt;br /&gt;
| 31 67&lt;br /&gt;
| 2C 00&lt;br /&gt;
| 7F 80&lt;br /&gt;
| 69 D8 A5 DE&lt;br /&gt;
|-&lt;br /&gt;
| UTF-16 BE&lt;br /&gt;
| 大尾序，不含BOM&lt;br /&gt;
|&lt;br /&gt;
| 67 31&lt;br /&gt;
| 00 2C&lt;br /&gt;
| 80 7F&lt;br /&gt;
| D8 69 DE A5&lt;br /&gt;
|-&lt;br /&gt;
| UTF-16 LE&lt;br /&gt;
| 小尾序，包含BOM&lt;br /&gt;
| FF FE&lt;br /&gt;
| 31 67&lt;br /&gt;
| 2C 00&lt;br /&gt;
| 7F 80&lt;br /&gt;
| 69 D8 A5 DE&lt;br /&gt;
|-&lt;br /&gt;
| UTF-16 BE&lt;br /&gt;
| 大尾序，包含BOM&lt;br /&gt;
| FE FF&lt;br /&gt;
| 67 31&lt;br /&gt;
| 00 2C&lt;br /&gt;
| 80 7F&lt;br /&gt;
| D8 69 DE A5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== UTF-16與UCS-2的關係 ==&lt;br /&gt;
UTF-16可看成是UCS-2的[[父集|母集]]。在沒有[[Unicode字符平面映射|輔助平面字符]]（surrogate code points）前，UTF-16與UCS-2所指的是同一的意思。但當引入輔助平面字符後，就稱為UTF-16了。現在若有軟件聲稱自己支援UCS-2編碼，那其實是暗指它不能支援在UTF-16中超過2位元組的字集。對於小於0x10000的UCS碼，UTF-16編碼就等於UCS碼。&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Windows操作系统内核对Unicode的支持 ===&lt;br /&gt;
Windows操作系统内核中的字符表示为UTF-16小尾序，可以正确处理、显示以4字节存储的字符。但是Windows API实际上仅能正确处理UCS-2字符，即仅以2字节存储的，码位小于U+FFFF的Unicode字符。其根源是Microsoft C++语言把 &amp;lt;code&amp;gt;wchar_t&amp;lt;/code&amp;gt; 数据类型定义为16比特的unsigned short，这就与一个 &amp;lt;code&amp;gt;wchar_t&amp;lt;/code&amp;gt; 型变量对应一个[[宽字符]]、可以存储一个Unicode字符的规定相矛盾。相反，Linux平台的GCC编译器规定一个 &amp;lt;code&amp;gt;wchar_t&amp;lt;/code&amp;gt; 是4字节长度，可以存储一个UTF-32字符，宁可浪费了很大的存储空间。下例运行于Windows平台的C++程序可说明此点：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// 此源文件在Windows平台上必须保存为Unicode格式（即UTF-16小尾）&lt;br /&gt;
// 因为包含的汉字“𪚥”，不能在简体中文版Windows默认的代码页936（即GBK）中表示&lt;br /&gt;
// 该汉字在UTF-16小尾序中用4个字节表示&lt;br /&gt;
// Windows操作系统能正确显示这样的在UTF-16需用4字节表示的字符&lt;br /&gt;
// 但是Windows API不能正确处理这样的在UTF-16需用4字节表示的字符，把它判定为2个UCS-2字符&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	const wchar_t lwc[] = L&amp;quot;𪚥&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	MessageBoxW(NULL, lwc, lwc, MB_OK);&lt;br /&gt;
&lt;br /&gt;
	int i = wcslen(lwc);&lt;br /&gt;
	printf(&amp;quot;%d\n&amp;quot;, i);&lt;br /&gt;
	int j = lstrlenW(lwc);&lt;br /&gt;
	printf(&amp;quot;%d\n&amp;quot;, j);&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Windows 9x|Windows 9x系统]]的API仅支持ANSI字符集，只支持部分的UCS-2转换。1996年发布的[[Windows NT 4.0]]的API支持UCS-2。[[Windows 2000]]开始，Windows系统API开始支持UTF-16，并支持Surrogate Pair；但许多系统控件比如文本框和label等还不支持surrogate pair表示的字符，会显示成两个字符。[[Windows 7]]及更新的系统已经良好地支持了UTF-16，包括Surrogate Pair。&lt;br /&gt;
&lt;br /&gt;
Windows API支持在UTF-16LE（&amp;lt;code&amp;gt;wchar_t&amp;lt;/code&amp;gt;类型）与UTF-8（代码页CP_UTF8）之间的转码。例如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
	char a1[128], a2[128] = { &amp;quot;Hello&amp;quot; };&lt;br /&gt;
	wchar_t w = L&amp;#039;页&amp;#039;;&lt;br /&gt;
	int n1, n2= 5;&lt;br /&gt;
	wchar_t w1[128];&lt;br /&gt;
	int m1 = 0;&lt;br /&gt;
&lt;br /&gt;
	n1 = WideCharToMultiByte(CP_UTF8, 0, &amp;amp;w, 1, a1, 128, NULL, NULL);&lt;br /&gt;
	m1 = MultiByteToWideChar(CP_UTF8, 0, a2, n2, w1, 128);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
== 外部連結 ==&lt;br /&gt;
* [http://www.unicode.org/notes/tn12/ Unicode Technical Note #12: UTF-16 for Processing] {{Wayback|url=http://www.unicode.org/notes/tn12/ |date=20211203150626 }}&lt;br /&gt;
* [http://www.unicode.org/faq/utf_bom.html#utf16-4 A very short algorithm for determining the surrogate pair for any codepoint]{{Wayback|url=http://www.unicode.org/faq/utf_bom.html#utf16-4 |date=20080926024051 }}&lt;br /&gt;
* [https://www.unicode.org/faq/utf_bom.html#utf16-11 Unicode FAQ: What is the difference between UCS-2 and UTF-16?] {{Wayback|url=https://www.unicode.org/faq/utf_bom.html#utf16-11 |date=20210502091429 }}&lt;br /&gt;
* [http://www.unicode.org/charts/charindex.html Unicode Character Name Index] {{Wayback|url=http://www.unicode.org/charts/charindex.html |date=20220106024046 }}&lt;br /&gt;
* {{IETF RFC|2781}}: UTF-16, an encoding of ISO 10646&lt;br /&gt;
* [http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#charAt(int) java.lang.String documentation, discussing surrogate handling] {{Wayback|url=http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#charAt(int) |date=20220118025034 }}&lt;br /&gt;
&lt;br /&gt;
{{-}}&lt;br /&gt;
{{Unicode related}}&lt;br /&gt;
{{Character encoding}} &lt;br /&gt;
&lt;br /&gt;
[[Category:Unicode轉換格式]]&lt;/div&gt;</summary>
		<author><name>imported&gt;黎景</name></author>
	</entry>
</feed>