文字コードって、とっても難しいです。
そんな文字コードの中で、文字符号化方式について、可能な限りわかりやすく解説します。
1.文字符号化方式とは
ASCⅡができたころは、「符号化文字集合」と「文字符号化方式」の区別はありませんでした。
ASCⅡ が ISO/IEC 646 として国際規格化され、JIS X 0201 や各国の文字集合ができ、それらの文字集合を混在して利用したいといったニーズと、漢字などを扱いたいというニーズから、ISO/IEC 2022 が誕生し、これが文字符号化方式のベースとなりました。
その後、ISO/IEC 10646(Unicode)が誕生し、現在の文字符号化方式は ISO/IEC 2022と ISO/IEC 10646 の大きく2種類の方法が存在しています。
ISO/IEC 2022 は、複数の文字集合を混在させて使用することができます。
ISO/IEC 646 は 7 ビットでしたが、ISO/IEC 2022 はそれを 8 ビットに拡張することで、7 ビットの文字集合を 2 つ持たせることができます。
ISO/IEC 2022 には 4 つのエリアがあり、それぞれ CL(control charactors)、GL(graphic characters)、CR(control charactors)、GR(graphic characters)と呼ばれ、CL と GL の 7 ビット部分が ISO/IEC 646 に相当します。
CLやCRには制御コードが収録されています。
ここに、JIS X 0201 のラテン文字集合と片仮名集合を呼び出すと以下のようになります。
以下は制御コードの簡単な説明です。CL の制御コードは ASCⅡ で説明したものと同じです。
このように ISO/IEC 2022 は、GL と GR それぞれに文字集合を呼び出すことができます。GL は 94 文字、GR は 94 または 96 の文字集合を呼び出せます。
正確には、GL や GR には直接文字集合を呼び出すことができず、G0 から G3 の中間バッファに指示して、G0 から G3 から GL や GR に呼び出します。
細かいルールとしては、G0 には 94 文字集合しか指示できません。G0 は GL からしか呼び出しできません。
文字集合を G0 から G3 の中間バッファに指示する際には、制御コードの「1B」(ESC)を使用します。
「1B」の後には、文字集合と指示するバッファーごとに、以下のようなコードが割り振られています。「Ft」は具体的な文字集合ごとに割り振られるコードです。
例えば、ASCⅡを G0 に指示する場合には「1B 28 @」、JIS X 0208(1997)を G1 に指示する場合には「1B 24 29 B」となります。
G0 から G3 に指示された文字集合を GL や GR に呼び出す場合には、「1B」(ESC)だけでなく、「0F」(SI)や「0E」(SO)、「8E」(SS2)、「8F」(SS3)を使用します。
中間バッファからコードテーブルへの呼び出しは「ロッキングシフト」と呼ばれます。
G0 は GL にだけ呼び出すことができます。
「ロッキングシフト」に対して、1 文字分だけ一時的に呼び出すことを「シングルシフト」と呼びます。「シングルシフト」は、G2 と G3 だけ使用することができ、通常は GL に呼び出されます( GR に呼び出すことも可能)。
ISO-2022-JP は、かつてインターネットで広く利用されていましたが、今ではメールで利用されている程度の文字符号化方式です。
データ量を小さくするために 1 バイト 7 ビットで設計されているため、GL 領域しか使用できません。
ISO-2022-JP で利用できる符号化文字集合は、「ASCⅡ」「JIS X 0201 ラテン文字」「JIS X 0208」です。メールで半角カナが使用できないのは、IOS-2022-JP で利用できる文字集合に「JIS X 0201 片仮名」が含まれていないためです。
ISO-2022-JPはデフォルトで、G0 に ASCⅡ が指示され、GL に G0(ASCⅡ)が呼び出されています。それ以外の文字集合は全て G0 と GL だけを使用して切り替えをします。
ISO-2022-JP-2004 の場合には、以下のようになります。
4.EUC-JP
EUC-JP は、UNIX で使われている文字符号化方式です。
EUC-JP で利用できる符号化文字集合は、「ASCⅡ」「JIS X 0201 片仮名」「JIS X 0208」「JIS X 0212」です。
ISO-2022-JP はデフォルトで、G0 に ASCⅡ、G1 に JIS X 0208 が指示され、GL に G0(ASCⅡ)が呼び出され、GR に G1(JIS X 0208)が呼び出されています。JIS X 0201 片仮名と JIS X 0212 は、それぞれ G2 と G3 に指示されていて、シングルシフトで GR に呼び出されます。
EUC-JP-2004 は、JIS X 0208 の代わりに JIS X 0213 の1面、JIS X 0212 の代わりに JIS X 0213 の2面が利用されます。
5.ISO-2022-JP と EUC-JP の文字コードの違い
「お年玉1万円」の文字コードは、ISO-2022-JP の場合、以下のようになります。
ISO-2022-JP のデフォルト文字集合は ASCⅡ なので、まずは「1B 24 42」で JIS X 0208 を呼び出すところから始まります。その後、半角の「1」の前に ASCⅡ を「1B 28 42」で呼び出して、また「1B 24 42」で JIS X 0208 を呼び出して、と GL 領域しか使用しないので、都度、文字集合を切り替える必要があります。
それに対して EUC-JP はデフォルトで GL 領域には ASCⅡ、GR 領域には JIS X 0208 が呼び出されているので、以下のように制御コードの使用なしで表現できます。
ASCⅡは、どちらも GL 領域にあるため、文字コードは同一になります。
JIS X 0208 は、ISO-2022-JP は GL 領域、EUC-JP は GR 領域にあるため文字コードは以下のように変わります。(ISO-2022-JP は、正確には 7 ビットなので、先頭の 0 は存在しない)
EUC-JP も半角カナを使うと制御コードが登場します。
「 お年玉1万円ダョ」の文字コードは、以下のようになります。
これが Shift-JIS の場合、制御コードが全く入らなくなります。
6.Shift-JIS
Shift-JIS には、なぜ制御コードが入らないのでしょうか?
それは文字集合の切り替えがないからです。
Shift-JIS は、JIS X 0208 の CR 領域と GR の空き領域を第 1 バイトで使用して、第 2 バイトを CL 領域や CR 領域も使用することで、全ての 2 バイト文字を一つの集合に収めました。
第 1 バイトは、81 から 9F、E0 から EF の 47 文字分です。
第 2 バイトは、40 から 7E、80 から FC の 188 文字分です。
通常の 2 バイトの文字集合は、94 × 94 = 8,836 文字を収録できますが、Shift-JIS も、47 × 188 = 8,836 文字を収録できます。
また Shift-JIS-2004 では、Shift-JIS の第 1 バイトで使用していなかった F0 から FC を使用することで、 60 × 188 = 11,280 文字を収録できるようになりました。
ちなみにShift-JISは、文字集合を呼び出すための制御コードは使用していませんが、改行コードなどは制御コードを使用しているため、まったく制御コードを使ってないわけではありません。
【振り返り】
第三回は、文字符号化方式(前編)でした。第四回は、後編です。
第一回:概要
第二回:符号化文字集合
第三回:文字符号化方式(前編)
第四回:文字符号化方式(後編)
第五回:サロゲートペア
第六回:IVS
第七回:文字コードの歴史
第八回:文字化け