ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

文字コードについて

 文字コードについての実用的な説明です。
 このページの仕様にもとづいて作成した文字コード表や、16進ダンプを使った解説のページもあります。

文字の種類

 1バイト・2バイト文字は、ローマ字、カナ、記号などのJIS非漢字と、第1・第2・第3・第4水準のJIS漢字に分類され、JIS規格によって決められています。 この他に、制御コードと呼ばれるデータがあり、文字と同様に扱っています。 また漢字は、94×94の領域に1字づつ配置されています。 この横の行を区、縦の列を点と呼び、区点番号で表すこともあります。
 これに対して、UCS(Universal Coded Character Set)のマルチバイト文字では、全世界の文字を扱えるようにISO/IECで決められた国際規格です。

JIS X 02111バイトJIS制御コード
JIS X 02011バイトJISローマ字 (ASCII)
JISカナ(半角カナ)
JIS X 02082バイトJIS非漢字・第1・第2水準漢字
JIS X 02132バイトJIS非漢字・第1・第2・第3・第4水準漢字
JIS X 0221マルチバイト
(UCS)
Unicodeベースの全世界の文字

 ホームページや、メールなどで、以下の文字列を見ることが多いと思います。

  Content-Type: text/plain; charset=ISO-2022-JP

 これは、テキストの文字コードが何で記述されているかを示すものです。
 ISO-2022-JPは、RFC-1468で定義されていて、インターネットでは標準的な日本語文字セットとして扱われています。 RFC-1468では、JISカナ、JIS補助漢字は、除外されています。 このことが、いわゆる半角カナが使えないサイトが多い理由です。 しかし、実際のデータとしては、使われている場合がありますので、入力データとしては対応しておくとトラブルが発生しません。 半角カナを全角カナに変換することは簡単ですので、対応しておくと良いでしょう。
 charsetには、他にも、以下のような指定があります。

charset=ISO-8859-1米国やヨーロッパで使われている文字セット
charset=ISO-2022-JPJIS X 0201とJIS X 0208の日本語文字セット
charset=Shift_JISSJISコードの日本語文字セット
charset=EUC-JPEUCコードの日本語文字セット
charset=ISO-2022-JP-2004JIS X 0213の日本語文字セット
charset=UTF-8Unicode(UTF-8)の日本語文字セット
charset=UTF-16Unicode(UTF-16)の日本語文字セット

文字コードの種類

 現在、インターネットの世界で使用されている文字コードは、JISコード、SJIS(Shift-JIS)コード、EUCコード、Unicodeの4つと考えてもほとんど問題はないと思います。
 以下に、よく利用されている4つのコードについての簡単な説明をします。

●JISコード

 インターネットで、最も標準的な文字コードです。 8ビットJISもありますが、ISO-2022-JPなどで使われているのは7ビットコードです。 7ビットコードでは最上位ビットを使用しないため、00-7Fまでの文字コードしか存在しません。
 JISコードでは、以下のエスケープシーケンスにより、文字の種類を決めます。

エスケープシーケンス1バイト目2バイト目文字の種類
  00-1F,7F 制御コード
1B 28 42ESC ( B20-7E ASCII
1B 28 4AESC ( J20-7E JISローマ字
1B 24 42ESC $ B21-7E21-7EJIS漢字(JIS X 0208)
1B 24 51ESC $ Q21-7E21-7EJIS漢字(JIS X 0213 1面)
1B 24 50ESC $ P21-7E21-7EJIS漢字(JIS X 0213 2面)

 JISローマ字は、ASCIIのバックスラッシュが¥になった文字集合です。
 JIS漢字には、JIS X 0208のJIS第1・第2水準とJIS X 0213で追加されたJIS第3・第4水準があります。

●シフトJISコード

 シフトJISコードは、SJISとも呼び、Microsoft社が決めたコードでWindows95やMS-DOSやMacなどで使用されています。
 SJISコードでは、エスケープシーケンスを使用しません。 また、SJISコードでは半角カナを 1バイトで扱えるため、表示桁数と内部バイト数が一致するという特徴があります。 ただし、第1バイトは必ず最上位ビットが立っていますが、第2バイトは立っていないこともあるので、プログラムをする場合は、注意しなければなりません。 特に、逆方向文字列検索時は、要注意です。
 また、2バイト文字の中に"\"(0x5C)を含むデータが存在するため、文字列がメタ処理されてしまい、文字化けする可能性があります。

1バイト目2バイト目文字の種類
00-1F, 7F 制御コード
20-7E JISローマ字(ASCII)
A1-DF JISカナ(半角カナ)
81-9F
E0-EF
40-7E
80-FC
JIS漢字

●EUCコード

 Extended Unix Codeの略で、日本語UNIXで使われているコードです。
 EUCコードでは、エスケープシーケンスを使用せず、ASCII以外の文字は、JISコードの上位ビットを立てることにより識別しています。
 シフトJISと異なり、JISカナ(半角カナ)は、表示桁数は1桁ですが、内部のバイト数は2バイトとなります。 そのため、JISカナ(半角カナ)に対応できていないプログラムが多いので、注意する必要があります。 インターネットで、JISカナ(半角カナ)が使えない理由もここにあり、UNIXから普及したための制限です。
 JIS補助漢字の場合は、内部のバイト数は3バイトになります。

1バイト目2バイト目3バイト目文字の種類
00-1F, 7F  制御コード
20-7E  JISローマ字(ASCII)
8EA1-DF JISカナ(半角カナ)
A1-FEA1-FE JIS漢字
8FA1-FEA1-FEJIS補助漢字

●Unicode(UCS-2)

 Unicode(ユニコード)は、ユニコード・コンソーシアムによって制定された文字コードです。 文字を2バイト、または4バイトで表し、世界中の文字を表現することができます。
 UCSは、Universal multiple-octet coded Character Setの略で、ISO 10646で制定されている世界統一文字コード規格です。 UCSには、2バイト(オクテット)で表すUCS-2と、4バイトで表すUCS-4があります。 UCS-4では、4バイトを群(Group)、面(Plane)、区(Row)、点(Cell)で表しますが、ほとんど使われていません。 このUCS-4の0群0面を基本多言語面(BMP:Basic Multilingual Plane)と呼びます。
 UCS-2は、BMPの上位の2バイトを省略した文字コードのことで、Unicodeと同一の仕様となっています。

 Unicode(UCS-2)では、A,I,O,Rの4つの領域に分かれています。
 日本語のJIS X 0208およびJIS X 0213は、CJK統合漢字として格納されています。 CJK統合漢字とは、中国(China)、日本(Japan)、韓国(Korea)の似ている漢字を同じ文字コードに割り当てたものです。

領域名文字コード内容
A領域00-4D Alphabet領域のことで、アルファベットなどの表意文字を格納する領域
I領域4E-9F Ideograph領域のことで、CJK統合漢字などの表意文字を格納する領域
O領域A0-DF Open領域のことで、将来の拡張ための予備領域
0xD7-0xDFは、サロゲート領域で、UCS-4の1面から16面の拡張用
R領域E0-FF Restricted領域のことで、PUAなどの限定使用領域
PUAとは、Private Use Areaの略で、外字などを格納する領域のこと

 JavaやXMLは、基本コードとして、Unicodeを採用しています。 また、WindowsNTやWindows98やWindows2000も、Unicodeを採用しています。
 従って、今後は、Unicode化が進んでいくでしょう。

UTF-8のエンコード方法

 UTF-8は、UnicodeとASCIIコードを混在させるための規格です。Unicodeでは、0x0000-0x007Fの文字コードは、ASCIIコードの0x00-0x7Fと同じとなっていることを利用して変換します。
 UTF-8では、ASCIIコードは、1バイトで表しますが、0x0800から0xFFFFまでのマルチバイト文字は、3バイトで表します。
 UTF-8では、各文字の先頭ビットにより、文字の種類を簡単に判定できます。

1ビットめの値
0:制御コード、ASCII文字
1:マルチバイト文字
マルチバイト文字の2ビットめの値
0:先頭文字以外
1:先頭文字
マルチバイト文字の先頭文字の3ビットめの値
0:2バイト文字(0x0080-0x07FF)
1:3バイト文字以上(0x0800-0x0010FFFF)
3バイト以上のマルチバイト文字の先頭文字の4ビットめの値
0:3バイト文字(0x0800-0xFFFF)
1:4バイト文字(0x00010000-0x0010FFFF)
1バイト目2バイト目 3バイト目4バイト目 文字の種類
00-7F
0xxxxxxx
    制御コード
ASCII文字
C0-DF
110xxxxx
80-BF
10xxxxxx
   UCS-2マルチバイト文字
(0x0080-0x07FF)
E0-EF
1110xxxx
80-BF
10xxxxxx
80-BF
10xxxxxx
  UCS-2マルチバイト文字
(0x0800-0xFFFF)
F0-F7
11110xxx
80-BF
10xxxxxx
80-BF
10xxxxxx
80-BF
10xxxxxx
UCS-4マルチバイト文字
(0x00010000-0x0010FFFF)

※ 上段は16進数、下段は2進数(x のビットは 0 または 1)

UTF-16のエンコード方法

 UTF-16は、Unicode(UCS-2)の文字は、そのまま2バイトで表現するUnicodeの標準的なエンコード方法です。 UCS-2のO領域内のサロゲート領域(0xD7-0xDF)を使って、UCS-4の中から、1面から、16面までの文字も表現できます。 文字コードで言うと、0x00000000~0x0010FFFFの文字が表現できます。

1バイト目2バイト目3バイト目 文字の種類
00-D7,E0-FF00-FF  Unicode(UCS-2)の文字
D8-DF00-FF00-FF UCS-4の第1面から第16面の文字


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp