[1] UTF-16 は、 [[ISO/IEC 10646]] の附属書 C で規定されている [[UCS]] の[[符号化表現]]の一つです。 ([[名無しさん]]) [2] [[送信装置]]は、[[受信装置]]が [[UCS-2]] しか解釈できない場合でも UTF-16 を送って構いません。 (C.7 参照。) ([[名無しさん]]) [3] C.7 は、 UTF-16/UCS-2 の実装を次のように分類しています。 (00 群 01 面以降を表す[[区点要素]]対の表示方法) , ,記号 ,知らない文字 ,知っている文字 ,UCS-2の実装 ,U ,〓〓 ,− ,弱い実装 ,W ,〓〓 ,α ,中程度の強さの実装 ,A ,〓 ,α ,強い実装 ,S ,〓 ,α ([SAMP(char)[α]]が 00 群 01 面以降にある知っている文字、 [SAMP(char)[〓]]は知らない文字の代替表現とする。) ([[名無しさん]]) [4] >>3 W の実装ってあるのだろうか? [5] 中程度の強さの実装と強い実装の違いはなんだ? * 符号化 = [6] [CODE(char)[[[U+D800]]]] から [CODE(char)[[[U+DFFF]]]] までは表現できません。 = [7] [CODE(char)[[[U-00110000]]]] から先は表現できません。 ([[ISO/IEC 10646]] には存在しますが、[[Unicode]] には存在しません。) = [8] それ以外で [CODE(char)[[[U+0000]]]] から [CODE(char)[[[U+FFFF]]]] であるなら、その[[符号位置]]と同じ値の[[16ビット符号単位]]によって表現します。 = [9] それ以外なら、つまり [CODE(char)[[[U+10000]]]] から [CODE(char)[[[U+10FFFF]]]] であるなら、 == [10] [VAR[U']] を[[符号位置]]から 0x10000 引いた値とします。この結果の値は20ビット非負整数です。 == [11] [VAR[W1]] を [VAR[U']] の上位10ビットと 0xD800 の[[論理和]]とします。 == [12] [VAR[W2]] を [VAR[U']] の下位10ビットと 0xDC00 の[[論理和]]とします。 == [13] 当該[[符号位置]]は [VAR[W1]] [VAR[W2]] の2つの[[16ビット符号単位]]の列によって表現します。 [14] >>9 を図示すると、次のようになります。 - [VAR[U']] = 0b[VAR[yyyyyyyyyy]][VAR[xxxxxxxxxx]] - [VAR[W1]] = 0b110110[VAR[yyyyyyyyyy]] - [VAR[W2]] = 0b110111[VAR[xxxxxxxxxx]] [15] [CITE@en[RFC 2781 - UTF-16, an encoding of ISO 10646]] ( ([TIME[2011-02-03 23:57:14 +09:00]] 版))