文字符号化方式として、Unicode では UTF-8, UTF-16, UTF-32 が、ISO/IEC 10646 では UCS-2, UCS-4 が用いられる。このうち UTF-8 は ASCIIコード とも共存でき、Webでテキストを交換するときによく使われる。
UCS-2とUCS-4
「Unicode=古今東西のあらゆる文字を収録」で述べたように、[ISO/IEC 10646-1: 1993 Universal Multiple-Octet Coded Character Set (UCS)」で規定された16ビット長(2オクテット)の文字符号化方式を UCS-2 と呼ぶ。
UCS-2は、U+0000からU+FFFFの範囲を扱うことができ、たとえば「山」は [U+5C71]:blue と表記する。
さらに多くの文字を含められるよう32ビット長(4オクテット)に拡張した文字符号化方式が UCS-4 である。UCS-2のU+00000000からU+0000FFFFに加え、U+00010000からU+7FFFFFFFの約21億文字分の領域が確保されている。
たとえば 𩸽 は、サロゲートペアで 0xD867+0xDE3Dの32ビットでコードされる。
サロゲートペアをUCS-4に変換する式を示す。
(0xD867 - 0xD800) * 0x400 + (L - 0xDE3D) + 0x10000 = 0x29E3D
となり、UCS-4では U+29E3D と表記する。
UCS-2は、U+0000からU+FFFFの範囲を扱うことができ、たとえば「山」は [U+5C71]:blue と表記する。
さらに多くの文字を含められるよう32ビット長(4オクテット)に拡張した文字符号化方式が UCS-4 である。UCS-2のU+00000000からU+0000FFFFに加え、U+00010000からU+7FFFFFFFの約21億文字分の領域が確保されている。
たとえば 𩸽 は、サロゲートペアで 0xD867+0xDE3Dの32ビットでコードされる。
サロゲートペアをUCS-4に変換する式を示す。
C = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000ここでは、H = 0xD867, L = 0xDE3D を代入し、
C:コードポイント(UCS-4)
H:上位サロゲート
L:下位サロゲート
(0xD867 - 0xD800) * 0x400 + (L - 0xDE3D) + 0x10000 = 0x29E3D
となり、UCS-4では U+29E3D と表記する。
UTF-16 と UTF-32
ISO/IEC 10646 で "UCS Transformation Format" として制定されたのが Unicode の文字符号化方式である。UTF-8, UTF-16, UTF-32 などがある。
UTF-16 は、「JIS X 0213 とサロゲートペア」で紹介したUnicodeの文字符号化方式そのものである。BMPの範囲であるU+0000~U+D7FFおよびU+E000~U+FFFFは2バイトで表し、サロゲートペアの領域は4バイトで表す。
UTF-16 は、Javaのchar型や、Windows XPのワイド文字といった内部処理に用いられることが多く、エンディアン に注意しなければいけない。
まず、ビッグエンディアン(バイト列の正順)は UTF-16BE、リトルエンディアン(バイト列の逆順)は UTF-16LE と呼んで区別している。
通常、UTF-16 と呼ぶものはビッグエンディアンだ。ただし、テキストの冒頭に BOM(U+FEFF)という特殊文字が置かれている場合、BOMが0xFE 0xFF の順に表れたらビッグエンディアン、0xFF 0xFE の順 ならリトルエンディアンとなる。BOM無しのリトルエンディアンは存在しない。
UTF-32 は UCS-4 と同じだ。
当初は、Unicode で必要とする U+0000からU+10FFFFの範囲に限られ、UCS-4 のサブセットの扱いだったが、将来の拡張領域として UCS-4 と同じ領域を表現できるようになった。
コンピュータ保管用のデータとして利用される機会は少ない。
UTF-16 は、「JIS X 0213 とサロゲートペア」で紹介したUnicodeの文字符号化方式そのものである。BMPの範囲であるU+0000~U+D7FFおよびU+E000~U+FFFFは2バイトで表し、サロゲートペアの領域は4バイトで表す。
UTF-16 は、Javaのchar型や、Windows XPのワイド文字といった内部処理に用いられることが多く、エンディアン に注意しなければいけない。
まず、ビッグエンディアン(バイト列の正順)は UTF-16BE、リトルエンディアン(バイト列の逆順)は UTF-16LE と呼んで区別している。
通常、UTF-16 と呼ぶものはビッグエンディアンだ。ただし、テキストの冒頭に BOM(U+FEFF)という特殊文字が置かれている場合、BOMが0xFE 0xFF の順に表れたらビッグエンディアン、0xFF 0xFE の順 ならリトルエンディアンとなる。BOM無しのリトルエンディアンは存在しない。
UTF-32 は UCS-4 と同じだ。
当初は、Unicode で必要とする U+0000からU+10FFFFの範囲に限られ、UCS-4 のサブセットの扱いだったが、将来の拡張領域として UCS-4 と同じ領域を表現できるようになった。
コンピュータ保管用のデータとして利用される機会は少ない。
HTMLの数値文字参照
HTMLでは、"&#x" につづけて16進数の文字コードを並べることで、当該文字を表示することができる。ここで指定する文字符号化方式は UCS-4(UTF-32)である。
UTF-8
UTF-8 は、ASCIIコードと互換性を持たせるため、ASCIIコードと同じ領域は1バイトで、それ以外の領域を2~4バイトで表現する可変長コードである。HTMLをはじめ、Webでテキストを交換するときによく使われるコードである。
バイト長 | UCS-4 | バイト列 | 備 考 | |
---|---|---|---|---|
1バイト | 最小 | U+0000 | 00 | ASCII文字 |
最大 | U+007F | 7F | ||
2バイト | 最小 | U+0080 | C2 80 | ラテン補助~ンコ文字 |
最大 | U+07FF | DF BF | ||
3バイト | 最小 | U+0800 | E0 A0 80 | サマリア文字~記号, CJK統合漢字~特殊用途文字 |
最大 | U+FFFF | EF BF BF | ||
4バイト | 最小 | U+10000 | F0 90 80 80 | 線文字B音節文字~顔文字, CJK統合漢字拡張~補助私用領域 |
最大 | U+1FFFF | F7 BF BF BF |
UTF-8 のメリット
- バイト単位で文字列検索や分離を行っても、バックスラッシュと円マークに起因するような文字化けを起こさない。
- ASCII文字が主体のテキストでは、データサイズをコンパクトにできる。
- 文字列長(文字の個数)を計算するのに手間がかかる。
- 漢字の多くが3バイトとなり、日本語テキストではシフトJIS よりデータが肥大化する。
A | あ | 漢 | 鷗 | 蔴 | 𦿶 | |
---|---|---|---|---|---|---|
JIS面区点 | 1-3-33 | 1-4-2 | 1-20-33 | 1-94-69 | 2-86-74 | 2-87-1 |
SJIS | 41 | 82 A0 | 8A BF | ? | ? | ? |
EUC-JP | 41 | A4 A2 | B4 C1 | 8F EC BF | 8F D9 BE | ? |
UCS-4 | 00 00 00 41 | 00 00 30 42 | 00 00 6F 22 | 00 00 9D D7 | 00 00 85 34 | 00 02 6F F6 |
UTF-16 | 00 41 | 30 42 | 6F 22 | 9D D7 | 85 34 | D8 5B DF F6 |
UTF-8 | 41 | E3 81 82 | E6 BC A2 | E9 B7 97 | E8 94 B4 | F0 A6 BF B6 |
参考サイト
- Unicode=古今東西のあらゆる文字を収録:ぱふぅ家のホームページ
- UTF-8を扱う際の注意:PowerShell Scripting Weblog
- UCS-4:四角向日葵のブログ
- UCSとUnicode:涼風庵 楡
(この項おわり)