社内SEになりました

社内SEは本当に楽なのか?ユーザー系IT企業とSierとの違いは?これからIT企業への就職や転職を考えている人むけに、ユーザー系IT企業から社内SEに40代で転職した筆者がITエンジニアの仕事内容やプロジェクト管理のノウハウ等をご紹介。

文字コード第三回:文字符号化方式(前編)

文字コードって、とっても難しいです。

そんな文字コードの中で、文字符号化方式について、可能な限りわかりやすく解説します。

1.文字符号化方式とは

ASCⅡができたころは、「符号化文字集合」と「文字符号化方式」の区別はありませんでした。

ASCⅡ が ISO/IEC 646 として国際規格化され、JIS X 0201 や各国の文字集合ができ、それらの文字集合を混在して利用したいといったニーズと、漢字などを扱いたいというニーズから、ISO/IEC 2022 が誕生し、これが文字符号化方式のベースとなりました。

その後、ISO/IEC 10646Unicode)が誕生し、現在の文字符号化方式ISO/IEC 2022ISO/IEC 10646 の大きく2種類の方法が存在しています。

f:id:SystemEngineers:20210531105016p:plain

2.ISO/IEC 2022

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 に相当します。

f:id:SystemEngineers:20210530155143p:plain

 CLやCRには制御コードが収録されています。

ここに、JIS X 0201ラテン文字集合と片仮名集合を呼び出すと以下のようになります。

f:id:SystemEngineers:20210530163257p:plain

以下は制御コードの簡単な説明です。CL の制御コードは ASCⅡ で説明したものと同じです。

f:id:SystemEngineers:20210531104955p:plain

f:id:SystemEngineers:20210530194218p:plain

このように ISO/IEC 2022 は、GL と GR それぞれに文字集合を呼び出すことができます。GL は 94 文字、GR は 94 または 96 の文字集合を呼び出せます。

正確には、GL や GR には直接文字集合を呼び出すことができず、G0 から G3 の中間バッファに指示して、G0 から G3 から GL や GR に呼び出します。

細かいルールとしては、G0 には 94 文字集合しか指示できません。G0 は GL からしか呼び出しできません。

f:id:SystemEngineers:20210530172038p:plain

文字集合を G0 から G3 の中間バッファに指示する際には、制御コードの「1B」(ESC)を使用します。

f:id:SystemEngineers:20210531195818p:plain

「1B」の後には、文字集合と指示するバッファーごとに、以下のようなコードが割り振られています。「Ft」は具体的な文字集合ごとに割り振られるコードです。

f:id:SystemEngineers:20210606133143p:plain

例えば、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)を使用します。

f:id:SystemEngineers:20210606125807p:plain

中間バッファからコードテーブルへの呼び出しは「ロッキングシフト」と呼ばれます。

G0 は GL にだけ呼び出すことができます。

「ロッキングシフト」に対して、1 文字分だけ一時的に呼び出すことを「シングルシフト」と呼びます。「シングルシフト」は、G2 と G3 だけ使用することができ、通常は GL に呼び出されます( GR に呼び出すことも可能)。

f:id:SystemEngineers:20210606131212p:plain3.ISO-2022-JP

ISO-2022-JP は、かつてインターネットで広く利用されていましたが、今ではメールで利用されている程度の文字符号化方式です。

データ量を小さくするために 1 バイト 7 ビットで設計されているため、GL 領域しか使用できません。

ISO-2022-JP で利用できる符号化文字集合は、「ASCⅡ」「JIS X 0201 ラテン文字」「JIS X 0208」です。メールで半角カナが使用できないのは、IOS-2022-JP で利用できる文字集合に「JIS X 0201 片仮名」が含まれていないためです。

f:id:SystemEngineers:20210606143627p:plain

ISO-2022-JPはデフォルトで、G0 に ASCⅡ が指示され、GL に G0(ASCⅡ)が呼び出されています。それ以外の文字集合は全て G0 と GL だけを使用して切り替えをします。

f:id:SystemEngineers:20210606133913p:plain

ISO-2022-JP-2004 の場合には、以下のようになります。

f:id:SystemEngineers:20210606135223p:plain

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 に呼び出されます。

f:id:SystemEngineers:20210606145347p:plain

EUC-JP-2004 は、JIS X 0208 の代わりに JIS X 0213 の1面、JIS X 0212 の代わりに JIS X 0213 の2面が利用されます。

5.ISO-2022-JPEUC-JP の文字コードの違い

「お年玉1万円」の文字コードは、ISO-2022-JP の場合、以下のようになります。

f:id:SystemEngineers:20210612183406p:plain

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 が呼び出されているので、以下のように制御コードの使用なしで表現できます。

f:id:SystemEngineers:20210612183950p:plain

ASCⅡは、どちらも GL 領域にあるため、文字コードは同一になります。

JIS X 0208 は、ISO-2022-JP は GL 領域、EUC-JP は GR 領域にあるため文字コードは以下のように変わります。(ISO-2022-JP は、正確には 7 ビットなので、先頭の 0 は存在しない)

f:id:SystemEngineers:20210612185207p:plain

f:id:SystemEngineers:20210612185956p:plain

EUC-JP も半角カナを使うと制御コードが登場します。

「 お年玉1万円ダョ」の文字コードは、以下のようになります。

f:id:SystemEngineers:20210612190659p:plain

これが Shift-JIS の場合、制御コードが全く入らなくなります。

f:id:SystemEngineers:20210612191542p:plain

6.Shift-JIS

Shift-JIS には、なぜ制御コードが入らないのでしょうか?

それは文字集合の切り替えがないからです。

Shift-JIS は、JIS X 0208 の CR 領域と GR の空き領域を第 1 バイトで使用して、第 2 バイトを CL 領域や CR 領域も使用することで、全ての 2 バイト文字を一つの集合に収めました。

第 1 バイトは、81 から 9F、E0 から EF の 47 文字分です。

f:id:SystemEngineers:20210612205542p:plain

第 2 バイトは、40 から 7E、80 から FC の 188 文字分です。

f:id:SystemEngineers:20210612205643p:plain

通常の 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
第七回:文字コードの歴史
第八回:文字化け