ミケネコ研究所 / 文字コードの部屋 / エンコードの種類

エンコードの種類

お手持ちのブラウザーで、「文字コードの選択」みたいなメニューを選んで見ましょう。ずらーっと出てきます。なんだかたくさんあって、ややこしいですね。


7 bit のコード

ASCII

ASCII (American Standard Code for Information Interchange, 情報交換のためのアメリカ標準コード)

1963年、ASA(American Standard Association)によって定めれられたアメリカ生まれのコードで、未だに強い影響力を持ちます。規格化された当時は 7bit での処理が主流でしたので、7bit 128 文字で構成されています。そのうち、制御文字が 34 文字、印刷可能な文字部分が 0x21〜0x7E 領域の 94 文字です。

0123 4567 89AB CDEF
0 NULSOHSTXETX EOTENQACKBEL BSHTLFVT FFCRSOSI
1 DLEDC1DC2DC3 DC4NAKSYNETB CANEMSUBESC FSGSRSUS
2 SP!"# $%&' ()*+ ,-./
3 0123 4567 89:; <=>?
4 @ABC DEFG HIJK LMNO
5 PQRS TUVW XYZ[ ]^_
6 `abc defg hijk lmno
7 pqrs tuvw xyz{ |}DEL

制御文字の意味は次のとおりです。

16進コード名プログラム記法意味英語
00NUL\0空白NUlL
01SOHヘッディング開始 TC1(Start Of Heading)
02STXテキスト開始 TC2(Start of TeXt)
03ETX テキスト終結 TC3(End of TeXt)
04EOT テキスト伝送終了 TC4(End Of Transmission)
05ENQ 問い合わせ TC5(ENQuiry)
06ACK 肯定応答 TC6(ACKnowledge)
07BEL\a 警告ベル (BELl)
08BS\b 後退 FE0(Back Space)
09HT\t 水平タブ FE1(Horizontal Tabulation)
0ALF\n 改行 FE2(Line Feed)
0BVT\v 垂直タブ FE3(Vertical Tabulation)
0CFF\f 書式送り FE4(Form Feed)
0DCR\r 復帰 FE5(Carriage Return)
0ESO シフトアウト (Shift Out)
0FSI シフトイン (Shift In)
10DLE 伝送制御拡張 TC7(Data Link Escape)
11DC1 装置制御1 (Device Control 1)
12DC2 装置制御2 (Device Control 2)
13DC3 装置制御3 (Device Control 3)
14DC4 装置制御4 (Device Control 4)
15NAK 否定応答 TC8(Negative AcKnowledge)
16SYN 同期信号 TC9(SYNchronous idle)
17ETB 伝送ブロック終結 TC10(End of Transmission Block)
18CAN 取り消し (CANcel)
19EM 媒体終端 (End of Medium)
1ASUB 置換キャラクタ (EOF-End Of File) (SUBstitute character)
1BESC 拡張 (ESCape)
1CFS ファイル分離キャラクタ(→) IS4(File Separator)
1DGS グループ分離キャラクタ(←) IS3(Group Separator)
1ERS レコード分離キャラクタ(↑) IS2(Record Separator)
1FUS ユニット分離キャラクタ(↓) IS1(Unit Separator)
20SPC 間隔・空白 (SPaCe)
7FDEL 削除 (DELete)

これら、0x01〜0x1B までの制御コードを画面上で表現するため、^A 〜 ^Z、^[ と表記することもあります。

ISO 646

さて、ASCII はアメリカ人にとっては大変都合がよいのですが、コンピュータの世界的普及とともに、他国からその国の独自の文字を使いたいという要望がたくさん出てきました。

これに対応するために、国際規格 ISO 646 で対処することにしました。ISO 646 は、いわば変種 ASCII です。ASCII 中の 94 文字中、83 文字を BCT(Basic Code Table)とし、各国で共通して使用しますが、残りの 12 文字については IRV(International Reference Version) とし、各国が好きな記号を当てはめてよいことになりました。これにより、各国版の ISO 646 が乱立する結果となりました。

0123 4567 89AB CDEF
0 NULSOHSTXETX EOTENQACKBEL BSHTLFVT FFCRSOSI
1 DLEDC1DC2DC3 DC4NAKSYNETB CANEMSUBESC FSGSRSUS
2 SP!"# $%&' ()*+ ,-./
3 0123 4567 89:; <=>?
4 @ABC DEFG HIJK LMNO
5 PQRS TUVW XYZ[ ]^_
6 `abc defg hijk lmno
7 pqrs tuvw xyz{ |}DEL

上記の ASCII の表のうち、青い記号計 12 文字を自由に差し替えてよいことになりました。各国が定めた記号を次の表に示します。

国名 規格名称 0x230x240x400x5B 0x5C0x5D0x5E0x60 0x7B0x7C0x7D0x7E
アメリカ US-ASCII #$@[ ]^` {|}
日本 JIS X 0201 Roman #$@[ ]^` {|}
イギリス BS 4730 £$@[ ]^` {|}
フランス NF Z 62-010-1982 # $ Á ° Ç § ^ µ é ù è ¨
ドイツ DIN 66 003 # $ § Ä Ö Ü ^ ` ä ö ü ß
スウェーデン SEN 85 02 00 Annex C # ¤ É Ä Ö Å Ü é ä ö å ü
スペイン IBM Spanish # $ · ¡ Ñ Ç ¿ ` ´ ñ ç ¨

8bit 拡張

ISO 8859

ISO 646 で諸外国が満足したかというと、そうではなく、たかだか 12 文字しか入れられない上に、ASCII との文書互換性が失われてしまうので、問題がありました。特に、# や { といった記号が書き換えられてしまうと、C 言語などプログラミングの分野で困ったことになりました。

そこで、ASCII はとりあえずみんな同じものを使うことにし、ASCII で空いていた A0h〜FFh の領域に、各国が望む記号を収録できるようにしたのが ISO 8859 です。ISO 8859-1 〜 ISO 8859-10 までがあります。

ISO 8859-1 (Latin-1) ラテン文字・西欧
アイスランド語、アイルランド語、イタリア語、英語、オランダ語、 スウェーデン語、スペイン語、デンマーク語、ドイツ語、ノルウェー語、 ポルトガル語、フィンランド語、フェロー語、フランス語
ISO 8859-2 (Latin-2) ラテン文字・東欧
アルバニア語、英語、スロバキア語、スロベニア語、 セルビア・クロアチア語、チェコ語、ドイツ語、ハンガリア語、 ポーランド語、ルーマニア語
ISO 8859-3 (Latin-3) ラテン文字・エスペラント
アフリカーンズ語、イタリア語、英語、エスペラント語、 カタルーニヤ語、スペイン語、ドイツ語、トルコ語、マルタ語
ISO 8859-4 (Latin-4) ラテン文字・北欧
英語、エストニア語、グリーンランド語、スウェーデン語、 デンマーク語、ドイツ語、ノルウェー語、フィンランド語、ラップ語、 ラトビア語、リトアニア語
ISO 8859-5 キリル文字 ロシア語
ウクライナ語、英語、セルビア語、ブルガリア語、 白ロシア語、マケドニア語、ロシア語
ISO 8859-6 アラビア文字 アラビア語
アラビア語、英語
ISO 8859-7 ギリシア文字 ギリシア語
ギリシャ語、英語
ISO 8859-8 ヘブライ文字 ヘブライ語
ヘブライ語、英語
ISO 8859-9 (Latin-5) ラテン文字・西欧+トルコ語
英語、アイスランド語、トルコ語、イタリア語、オランダ語、 スウェーデン語、スペイン語、デンマーク語、ドイツ語、ノルウェー語、 ポルトガル語、フィンランド語、フェロー語、フランス語
ISO 8859-10 (Latin-6) ラテン文字 北欧
英語、エストニア語、グリーンランド語、スウエーデン語、 アイスランド語、フェロー語、 デンマーク語、ドイツ語、ノルウェー語、フィンランド語、サミ語、 ラトビア語、リトアニア語

ISO 8859-1

ISO 8859 のうち、最もよく使われているのが西欧諸国で用いられる ISO 8859-1 で、特別に Latin-1 と呼びます。

0123 4567 89AB CDEF
A  ¡¢£ ¤¥¦§ ¨©ª« ¬­®¯
B °±²³ ´µ· ¸¹º» ¼½¾¿
C ÀÁÂÃ ÄÅÆÇ ÈÉÊË ÌÍÎÏ
D ÐÑÒÓ ÔÕÖ× ØÙÚÛ ÜÝÞß
E àáâã äåæç èéêë ìíîï
F ðñòó ôõö÷ øùúû üýþÿ

ISO 646 の 多バイト拡張

これまでよく使われてきた、SJIS, ISO-2202-JP, EUC-JP について。


コード範囲
+------+------------------+------+------------------+
| 0  1 | 2  3  4  5  6  7 | 8  9 | A  B  C  D  E  F |
+------+------------------+------+------------------+
|      |                  |      |            |     |
|      |                  |      |            |     |
|      |                  |      |            |     |
+ Ctr  +------------------+------+------------------+
|      |                  |      |                  |
|      |                  |      |                  |
|      |                  |      |                  |
+------+------------------+------+------------------+

シフト JIS


+------+------------------+------+------------------+
| 0  1 | 2  3  4  5  6  7 | 8  9 | A  B  C  D  E  F |
+------+------------------+------+------------------+
|      |ASCII             | SJIS |JIS X 0201  | SJIS|
|      |  または          |1byte |  半角カナ  |1byte|
|      |JIS X0201 ローマ字|  目  |            |  目 |
+ Ctr  +------------------+------+------------------+
|      |      |                                     |
|      |  x   |         SJIS    2byte 目            |
|      |      |                                     |
+------+------------------+------+------------------+

【背景】16bit パソコンの日本語版を作ろうとしたとき、ASCII 文字と日本語を共存させるために、Microsoft 社やアスキー社などが共同開発した文字コードです。Windows95、Dos、Macintosh マシンの内部コードとして使われ、一部のベンダー (HEWLETT PACKARD 社) で UNIX マシンの内部コードとして採用していることもあります。

それまで日本の 8bit マシンで使われていた ASCII 文字と半角カナの領域はそのまま受け継ぎました。日本語は次のような 2 バイトで表現します。まず、1 バイト目には ASCII 文字と半角カナ以外の領域 (81h〜9Fh, E0h〜EAh) を使って区別をつけ、2 バイト目は 40h〜FCh と広く使います。ISO-2022 では禁断の制御領域 (80h〜AFh) をも使っているので、JIS と呼ぶには相応しくないコードです。

シフト JIS は独自の文字コードながらパソコンの普及により多く利用され、ついに1997年に JIS 規格(X 0208:1997)として取りこまれました。将来的に、シフト JIS から、半角カナが取り除かれるような意向も盛りこまれています。

参考:JIS X 0208  改正案説明資料 より

今回の改正では,この“シフトJIS”に関する規定を新たに規格中に取
り入れることとしたが,その際,“シフトJIS”又は現在の国内での文
字コードの抱える問題点を明らかにし,ユーザにこのような問題点を
回避することのできる情報を与えることを意図して規格化を行った。

(中略)

1992 年の韓国での KS 5601  の改正及び中国で現在開発が行われてい
る GBK など,国際規格体系ではなく,シフトJISをもととした体系が
周辺諸国で今後とも広く用いられる可能性が高い。これらの状況から
場合によっては,シフトJISの体系を今後とも利用する必要が出てくる
可能性を考慮し,JIS X 0201で規定される 1 バイト片仮名に関して
は,将来削除予定とすることによって,将来の改正において,この1バ
イト片仮名の利用を削除することによって,シフトJISの体系を今後と
も利用可能とする余地を残すこととした。ただし,この半角片仮名の
利用を削除することによって得られる符号上の空き領域に関しては,
少なくとも5年ないしは10年以上先に,依然としてシフトJISが広く用
いられている場合にのみ,利用を考えるべきであり,符号系の移行に
は,十分な時間をとる必要があると考える。


ISO-2022-JP


+------+------------------+------+------------------+
|  C0  |       GL         |  C1  |        GR        |
+------+------------------+------+------------------+
| 0  1 | 2  3  4  5  6  7 | 8  9 | A  B  C  D  E  F |
+------+------------------+------+------------------+
|      |ASCII             |      |                  |
|      |  または          |  x   |        x         |
|      |JIS X0201 ローマ字|      |                  |
+ Ctr  +------------------+------+------------------+
|      |JIS X 0208-1983   |      |                  |
|      |  または          |  x   |        x         |
|      |JIS C 6226-1978   |      |                  |
+------+------------------+------+------------------+

【背景】インターネットの前身 JUNET で日本語を含めた電子メールやニュースグループ記事において、ISO 2022 のサブセットとして考案され、以後インターネットの標準エンコードとして用いられています。俗称、JIS コード、JUNET コード。

ISO-2022 は、エスケープシーケンスによって、それ以降の文字を決定します。たとえば、「1B 28 42」の3バイトを宣言すれば、以後、別のエスケープシーケンスが宣言されるまでの間は ASCII 文字の連続だという意味になります。文章の初めは ASCII が設定されているものだと仮定されています。ISO-2022-JP で用いられるエスケープシーケンスは、次の4種です。

2バイト文字へのエスケープシーケンス
JIS C 6226-1978(旧JIS)       1B 24 40    [ESC] $ @
JIS X 0208-1983(新JIS83)     1B 24 42    [ESC] $ B
1バイト文字へのエスケープシーケンス
JIS X0201-1976 ローマ字      1B 28 4A    [ESC] ( J
ASCII                        1B 28 42    [ESC] ( B
例1:「12(1B 24 42)(1B 28 42)24(1B 24 42)日はクリスマスイブ(1B 28 42)」
上の赤い部分が、埋め込まれたエスケープシーケンスです。

エスケープシーケンスのぶんだけ、EUC、SJIS に比べてファイルサイズが増えます。

ISO-2022-JP では、文章の途中だけを抜き出して、この文字が何であるかを決定できません。エスケープシーケンスの宣言が見つかるまでさかのぼらなくてはなりません。また、任意の行を切り取ると、エスケープシーケンスがついてこないので、下手なエディタでは文字化けが発生してしまいます。せめて 1 行単位で切り取っても弊害がないように、

というルールを定めています。

ISO-2022-JP-1

ISO-2022-JP-1 は、
JIS X 0212-1990(JIS補助漢字) 1B 24 28 44    [ESC] $ ( D
を追加したものです。実際に普及はしていません。

ISO-2022-JP-2

ISO-2022-JP-2 は、多言語が扱えるように、エスケープシーケンスを大量に追加しました。実際に普及はしていません。

ISO-2022-JP-3

ISO-2022-JP-3 は、いわゆる JIS 2000 (JIS 第 3 水準、JIS 第 4 水準)が使えるように拡張されました。


EUC-JP

EUC (Extended Unix Code)


+------+------------------+------+------------------+
|  C0  |       GL         |  C1  |        GR        |
+------+------------------+------+------------------+
| 0  1 | 2  3  4  5  6  7 | 8  9 | A  B  C  D  E  F |
+------+------------------+------+------------------+
|      |                  |      |  【JIS 漢字】    |
|      |ASCII             |      |JIS X 0208-1990 or|
|      |  または          |  x   |JIS X 0208-1983 or|
|      |JIS X0201 ローマ字|      |JIS C 6226-1978   |
+ Ctr  +------------------+------+------------------+
|      |                  |      |JIS X 0201  |     |
|      |                  |  x   | 半角カナ   |     |
|      |                  |      |            |     |
+      +------------------+------+------------------+
|      |                  |      |  【補助漢字】    |
|      |                  |  x   | JIS X 0212-1990  |
|      |                  |      |                  |
+------+------------------+------+------------------+

【背景】UNIX マシンの標準コードです。日本語環境の UNIX システムで、1バイトである ASCII 文字と、2バイトの日本語を共存させるために考え出されました。JIS コードをちょっと特殊に独自改良してあります。日本語版のほかに、各国語版 EUC がたくさん作られて、やはり UNIX システムで使われています。

表からもわかるように、GR には 3 種の文字コードがマッピングされていますが、普段は JIS X 0208 が指定されています。半角カナや補助漢字を使いたい時は、シングルシフトと呼ばれるコントロールコードを、1文字ごとに頭に付けます。そのため、半角カナは、SS2(8Eh) + コード(A1h〜DFh) の 2 バイト表現となり、補助漢字は SS3(8Fh) + コード(A1h〜FEh) の 3 バイト表現となります。


過去の産物

EBCDIC

Extended BCD Interchange Code. (BCD, binary coded decimals)

IBM 社が、1964 年に発表した規格。自社メインフレームの標準コードとして普及し、以後汎用コンピュータの内部コードとして定着しました。

ASCII が 7bit に対し、EBCDIC は 8bit です。ASCII と違い、配置が不連続なのが特徴です。数字が F0h 〜 F9h に配置されているのは、「ゾーン 10 進数」の影響でしょうか?当時の様子を知らないのでわかりません。

EBCDIK

EBCDIC に拡張を施し、カタカナを使えるようにしたもの。富士通と日立で、微妙に異なる。

NEC 漢字コード


+------+------------------+------+------------------+
| 0  1 | 2  3  4  5  6  7 | 8  9 | A  B  C  D  E  F |
+------+------------------+------+------------------+
|      |                  | 罫線 | JIS X 0201 |罫線 |
|      |    ASCII         |  ・  | 半角カナ   | ・  |
|      |                  | 記号 |            |記号 |
+ Ctr  +------------------+------+------------------+
|      |                  |      |                  |
|      | JIS C 6226-1978  |  x   |        x         |
|      |                  |      |                  |
+------+------------------+------+------------------+

【背景】PC-9801 以前、BASIC 等で用いられていたらしいです。パソコン通信で広く普及したものと思われます。NEC-JIS。

ISO-2022-JP がモデルになっていますが、1byte 文字は 00h〜FFh をフル利用します。前半 (00h〜7Fh) が ASCII、後半 (80h〜FFh) には半角カナ・罫線・トランプの記号などの独自記号を配置してあります。2byte 文字は、ISO-2022-JP を基準としていますが、独自のエスケープシーケンス (KI コード 1B4Bh / KO コード 1B48h) で、漢字・非漢字を切り替えています。

手元の MS-DOS ver 5.0 ハンドブックを見ると、FILECONV という NEC 製の外部コマンドがあり、N88-日本語BASIC(86)ファイルと MS-DOS ファイルとの変換をするとの記述があります。おそらくこれが、NEC 漢字コード / シフト JIS コンバータなのでしょう。

TRON コード

国産の国際多言語コード。

TRON コードは、16 bit の文字コード面を 4 つの領域に分け、1面で 48,400 文字を扱います。複数の面を扱うことができますが、面の切り替えのために特殊なシーケンスが必要になります。世界で初めて、各国 13 万文字を扱える製品が出荷されました。

ISO 2022 よりは考えられているが、似たりよったりである。Unicode よりダメ。


文字コードの部屋 http://mikeneko.creator.club.ne.jp/~lab/kcode/
お問い合わせ <lab@mikeneko.ne.jp>