文字コード・ノート
作成日: 1999年03月30日
最終更新日: 1999年07月20日
1960年代、大型計算機でさえもその入出力にはアルファベットや数字のみが使われていました。
その当時のコンピュータの性能は現在と比べて劣ったものでしたし、化学技術的計算がその主要目的
でしたから、使用する文字はプログラムを作れさえすれば事足りると考えられていました。
複数のコンピューター間で情報のやり取りをするようになり、文字コードの共通規格が必要になった
時点でも、英数字以外の文字の使用は前提になっていなかったのかも知れません。ISO 646 制定時、
1文字を6bitのコードで表現する(64文字分のコードポイント)案が議論されていたことを考えると、
他の言語の文字を使って情報をやり取りすることなどとても考えられない状況だったのでしょう。
現在、当時の大型計算機以上の性能のコンピュータを個人が持ち、日本語の文字を使って
インターネット上に日記を公開するような時代になりましたが、その大きな変化はそれからの三十年の間に
起こったことなのです。「メールで半角カタカナを使うな」などと言われても、二十数年前、半角カタカナ
を使えるようになり「うおー、すごいなー」と感心していた世代には信じられないことです。
文字コードの歴史はコンピュータの性能の向上と共に歩んできましたが、過去の膨大な遺産を
無にしないように、その利用法は今まであった仕組みの上に新しい仕組みを継ぎ足していきました。
ある日突然、過去のシステムとの互換性を無視して、シンプルで拡張性に富んだシステムを採用する
などということは出来ませんでした。
こうしたシステムの増築や改築の結果、一つの文字の二重符号化の問題や、複数の文字コードの
切り替え方、7bitの文字しか伝送できないシステムのための様々なエンコーディング法など、
情報交換用のコード体系は複雑な仕組みになってしまいました。
テキストが英文だけの場合は、7bitの単バイトコード(128のコードポイントが出来る)、いわゆる
ASCIIコードだけを使用して記述できます。日本語では漢字や仮名を使用するので当然それだけの
コードポイントでは足りません。そこで複数バイトを使って一つの文字を表しています。
このため、一つの文書に単バイトの英数字と複数バイトの日本文字を記述する場合、
なんらかの操作(エンコーディング)をしなければなりません。
現在、日本語の運用方法は数種類あり、普段は意識せずに情報のやり取りをして
いますが、なんらかの原因でアプリケーションの対応や設定などが悪い場合には文字化けと
なって悩ませます。
文字コードに関する用語も誤解を招きやすい言い方が広く使われているので、理解するのが大変です。
例えば『JISコード』という言葉は色んな場面で使われています。文字通り
JISで定められたコードと言う意味合いでとれば、シフトJISも1987の改正でJIS X 208に含まれましたし、
一番最初に定められたJIS X 201では、単バイトの英数字や記号、カタカナしか表せません。
さすがに JIS X 201 を指して「JISコード」と言う人はいないでしょうが、
漢字を表すためのコードという意味でも、次の様に色々に使われています。
- 符号化文字集合としてのJISコード
漢字や仮名などの日本文字を重複することなく集め、その一つの文字に対して一つの
符号(7bit・2バイトのコード)を与えたJISコード体系(JIS X 208)
- JIS X 208で定義された符号化文字集合中の、ある特定の文字のコード番号。
例:「『亜』のJISコードは3021hだ」
- JISコードの運用方法としてのISO-2022-JP
日本語のエンコーディング方法(英数字を表す単バイトコードと、
漢字や仮名を表す2バイトコードを一緒に使うための方法)の一つ
例:「メールではJISコードを使わなければならない」
一つの文字に対して一つのコードポイントを重複することなく与えた集合を符号化文字集合と
いいます。
世界にはその国の言語によって色々な符号化文字集合が作られています。7bit単バイトのコー
ドで表現されるISO 646 IRVはASCIIコードとして広く使われていますし、ラテン系の文字を持つ
西欧諸国では8bit・単バイトのISO 8859が使われています。
また漢字のように、たくさん文字が含まれる場合は、複数バイトで一文字を表す方法を採っ
ています。例えば7bit系2バイトで一つの文字を表すものとしては、日本語の場合はJIS X 208
(JISコード) 、中国語の場合 GB 2312 や韓国語の KS C 5601など 、8bit系2バイトとしては
台湾で使われてきた Big-5 など様々な符号化文字集合があります。
ISO 646 : ISO 7-bit coded character set for information interchange その国際標準版としてIRV(International Reference Version)がある。
ISO 8859 : 8-bit single-byte coded graphic character sets
初めは内部コードとして使われてきたが、その後情報交換用としても使われるようになる。特にISO 8859-1はLatin-1として広く使われている。
現在JIS規格になっている符号化文字集合。
現在日本では、次のような符号化文字集合が使われています。
JIS X 201 「情報交換用符号」
- 7bit系
-
- 8bit系
8bit系は7bit系の二つの文字セットを組み合わせたもの。前の領域に7bit系のローマ字セット、
後ろの領域に7bit系のカタカナセットというように配置。
Alphabet,Numeric,Katakanaの頭文字を取ってANK文字と呼ばれる。
このJIS X 201で決められた単バイトのカタカナがいわゆる『半角カナ』である。
JIS X 208 「7ビットおよび8ビットの2バイト情報交換用符号化漢字集合」
第一水準2965字、第二水準3390字の漢字、及び仮名・記号524字、計6879字を規定。
1997年の改訂では、JIS漢字コードを単独で用いる場合、JIS 201 又はISO 646 IRVと同時に用いる場合
(EUCの符号化)、JIS漢字コードの派生コードとしてシフトJISやRFC 1468の符号化(ISO 2022 JP)が
付属書として規格に加わる。つまり、JIS X 208はJIS漢字コードという符号化文字集合だけを決めたもの
ではなく、その運用方法もその中に含まれ、名称も「情報交換用漢字符号」から「7ビットおよび8ビットの2バイト情報交換用符号化漢字集合」に変わった。
JIS X 212 「情報交換用漢字符号--補助漢字」JIS X 208に収められなかった漢字5801字をふくむ、6067字。
JIS X 221 世界中の文字を一つにまとめた符号化文字集合、ISO 10646-1(USC:Universal Character Set)。
4オクテッド(32bit)の単位のシングルバイトで処理する。
世界中の文字に一連の32bitのコード番号を付ける(UCS-4)というもの。
現在はBMP面だけが定義され、2オクテッド(16bit)のコード(UCS-2)として使われている。いわゆるUnicode。
1978年に制定された日本語を表すための符号化文字集合で、JISコードと呼ばれています。
7bit系2バイトの符号化文字集合で、上位バイト下位バイト共に、0x21から0x7Eまでの94個の
コードポイントによって表されている。特徴をあげると、
漢字、カタカナ、仮名、英数字、記号などを含む。
JIS X 208 には、英数字なども含まれている(いわゆる全角の英数字)。これは
ISO 646 で規定された英数字(いわゆる半角英数字)に、もうひとつのコードポイント
を与えてしまった。その結果、 ISO 2022 を使ったエンコーディングした場合、一つの文字に対して
『半角』『全角』という二つのコードポイントが存在するという問題を作った。
7bitを1バイトとし、2バイトで一つの漢字のコードポイントを表す。
それぞれの各バイトは、7bitで表せる128のコードポイントの内、制御文字部分32個と0x20(space)と0x7F(delete)の2個をのぞいた
94個のコードポイントの範囲を使う。(94文字集合)
というわけで94×94=8836個の漢字まで表現できる。
ISO 2022の準拠のエンコード法により、複数の文字セットを使い分けることができる。
JISコードは7bit系2バイトのコード体系ですが、それを上位バイトと下位バイトと分け、その
二つの94個のコードポイント群を、それぞれ「区」と「点」と呼び、1から94までの数字で表した
のが区点コードである。
例えば、「亜」の字は、区点コードでは、16区01点となる。
区点ごとに16進表示すれば
16区 = 上位バイト 0x10
01点 = 下位バイト 0x01
いうことになり、制御文字部分を避けるためそれぞれに0x20の
下駄を履かせると
上位バイト 0x30
下位バイト 0x21
JISコードの、0x3021ということになる。
ここでいうエンコーディングとは、様々な文字セットを切り替えて使うための運用方法としての
エンコーディング(暗号化)である。
7bitデータしか想定していないサーバーを通すために、8bitデータを7bitの図形文字に変換するする操作もエンコーディングと呼ぶが、
それはMIMEの章で記述する。
複数の文字セットを切り替える方法の国際規格として ISO 2022 がある
(日本でもそれは JIS X 202 としてJIS規格になっている)。
現在使われている、日本語のエンコーディング法としては
ISO-2022-JP
ISO 2022準拠の7bit系のエンコーディング法。インターネットでの合意としてRFC 1468で規定されて
いる。(ISOとついているが国際標準化機構の規格ではなく、RFC 1468で合意されたエンコーディング法
の名称である) 7bit系JIS X 201 カタカナ(いわゆる半角カタカナ)が使えない。
日本語EUC(Extended UNIX Code)
ISO 2022準拠の8bit系のエンコーディング法。UNIXの日本語環境でよく使われている。
シフトJIS
一般的なパソコンのOS、MACやWindowsの内部コードとして使われている
。JIS X 208の1997年改訂で正式に規定された。
複数の文字セットを切り替える方法のISO規格
ISO 2022 には、8bit系と7bit系のエンコーディング法がある。
7bit系は、インユース・テーブル(実際に参照するアドレス空間)を制御文字領域C0と
図形文字領域GLに分ける。各文字集合を、G0、G1、G2、G3の四つ中間バッファに割り当てておき
、そのうえで各中間バッファをGLに呼び出すという手順を踏む。
-
文字集合を中間バッファに割り当てることを「指示する(designate)」といい、中間バッファをGL
領域に割り当てることを「呼び出す(invoke)」という。
-
指示はエスケープ・シーケンスを使って行われ、呼び出しは制御文字を使って行われる。
-
GLに呼び出されている中間バッファに対して、別の文字集合を指示すれば
改めて呼び出しを行うことなく、その結果はインユース・テーブルのGLに反映される。
-
使われうる文字集合は、94文字集合または96文字集合でなければならない。
中間バッファG0へは94文字集合しか指示できない。
-
一度呼び出したら次の文字集合を呼び出すまで有効な呼び出し方をロッキングシフトという。
それに対して、一文字だけ臨時に呼び出す方法をシングルシフトと言う。
8bit系は7bit系を二つ合わせたような構造になっている。インユース・テーブルの構成は
、制御文字領域C1と図形文字領域GRが加わり、C0、GL、C1、GRとなる。
G0をGRに呼び出すことは出来ない。
ISO 2022はこのように複雑な仕組みになっているため、これをすべて実装するのは
大変です。実際に使われる場合は、指示や呼び出しを固定するなどして簡略化したものを使っています。
8bit系のISO 2022の簡略判が日本語EUCです。次のように
指示や呼び出しが固定されているので、エスケープシーケンスを使う必要がありません。
G0にASCIIを指示しGLに呼び出すように固定。
G1にJIS X 208を指示しGRに呼び出ように固定。
このためJIS X 208の第1バイトと第2バイトのMSBを1とする。
G2にJIS X 201 カタカナを指示するように固定し、シングルシフトで使用。
シングルシフトのための制御文字SS2(0x8E)が付加され、0x8Eから始まる2バイトの文字になっている。
G3にJIS X 212 補助漢字を指示するように固定し、シングルシフトで使用。
シングルシフトのための制御文字SS3(0x8F)が付加され、0x8Fから始まる3バイトの文字になっている。
ISO 2022の7bit系を用いたエンコーディング法がISO-2022-JPです。以下のように簡略化されています。
このISO 2022-JPというエンコーディング法は日本ではJUNET(1984年設立
Japanese University Network 後にJapanese UNIX Network)の中で当時から使用されており、
1993年、RFC 1468(Japanese Character Encoding for Internet Messages)
ととなった。
RFC 1468によれば、ISO 2022-JPの
エスケープ・シーケンスは次のように決められている。
Esc Seq Character Set
ESC ( B ASCII
ESC ( J JIS X 0201-1976 ("Roman" set)
ESC $ @ JIS X 0208-1978 旧JIS
ESC $ B JIS X 0208-1983 新JIS
>RFC 1468によれば、ISO 2022-JPでは、単バイトコードとしてASCIIとJIS X 201 ローマ字、2バイトコードとして
JIS X 208の第一水準と第二水準しか規定していません。そのため、メールやニュースでは1バイトのカタカナ
(いわゆる半角カタカナ)を使えないということです。
8bitの単バイト文字( 8bit系JIS X 201、英数字・記号・カタカナ)と2バイト文字
(JIS X 208で定義された符号化文字集合)を一緒に使う方法。
7bit系しか受けつけないネットワークではそのままでは使えない。
単バイトのカタカナを生かすためにコード空間を分断してしまったので、
ISO 2022を使っての拡張が出来ない。つまりJIS X 201、JIS X 208以外の文字セットを使うことが出来ない。
以下はその方法である。
最初のバイトに0x81〜0x9Fの31個と0xE0〜0xEFの16個の範囲の番号がきたら、次に続く番号と合わせ、2バイトの文字と解釈する
その時の2バイト目は制御文字領域(0x00〜0x1F)とCP/Mの使用領域(0xFD〜0xFF)を避けた、0x40〜0x7Eと0x80〜0xFCの間の計188個(63+125)の番号を使う
総計 47×188=8836 文字表せる。 これでJISコードのコードポイント数(94×94=8836)とも互換性がとれるわけである。
インターネット上には7bitのコードしか通さないサーバーがあるため、
8bitの文字コードや画像などのバイナリーデータはそのままでは送れません。
また制御文字や特殊な記号を含んだデータは誤って解釈されてしまう恐れもあります。
そのため、8bitのコードを7bitの安全なコード(ASCIIの図形文字領域のコード)に変換して送信し、
受信後8bitに復号するという方法で情報をやり取りしています。
その規格の提案が、MIME(Multipurpose Internet Mail Extensions)です。またMIMEでは、
複数の文書を送信する(添付ファイル)ための仕様も規定されました。
MIMEの仕様に従うことによって、送信されてきたデータをアプリケーションが的確に復号し
利用する事が出来るわけです。
例えばISO-2022-JPのテキストであれば、Content-typeの値としてtext/plain
、そのパラメータである
charsetの値をヘッダーフィールドに以下のように記述します。
Content-type: text/plain; charset=iso-2022-jp
現在登録されているcharsetの値としては次のようなものがあります。
- US-ASCII
- EUC-KR
- ISO-2022-JP
- ISO-2022-JP-2
- ISO-8859-1
- Shift_JIS
- EUC-JP
- GB2312
- Big5
MIME 関連文書
- 1962
ASCIIコードがANSIの規格となる
ASCII:American national Standard Code for Infromation Interchange
『情報交換』という言葉が入っているのは、外部のコンピュータとデータをやりとりするための文字コード
という意味で決められた。
ASCII コード表
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F
|
---|
0 |
0 NUL null |
1 SOH start of heading |
2 STX start of text |
3 ETX end of text |
4 EOT end of transmission |
5 ENQ enquiry |
6 ACK acknowledge |
7 BEL bell |
8 BS backspace |
9 HT horizontal tab |
10 LF line feed, new line |
11 VT vertical tab |
12 FF form feed, new page |
13 CR carriage return |
14 SO shift out |
15 SI shift in |
1 |
16 DEL data link escape |
17 DC1 device control 1 |
18 DC2 device control 2 |
19 DC3 device control 3 |
20 DC4 device control 4 |
21 NAK negative acknowledge |
22 SYN synchronous idle |
23 ETB end of trans. block |
24 CAN cancel |
25 EM end of medium |
26 SUB substitute |
27 ESC escape |
28 FS file separator |
29 GS group separator |
30 RS record separator |
31 US unit separator |
2 |
32 SP space |
33 ! exclamation mark |
34 " (double) quotation mark |
35 # number sign |
36 $ dollar sign |
37 % percent sign |
38 & ampersand |
39 ' apostrophe,single quote mark |
40 ( left parenthesis |
41 ) right parenthesis |
42 * asterisk |
43 + plus sign |
44 , comma |
45 - minus sign, hyphen |
46 . period, decimal point, full stop |
47 / slash, virgule, solidus |
3 |
48 0 |
49 1 |
50 2 |
51 3 |
52 4 |
53 5 |
54 6 |
55 7 |
56 8 |
57 9 |
58 : colon |
59 ; semicolon |
60 < less-than sign |
61 = equal sign |
62 > greater-than sign |
63 ? question mark |
4 |
64 @ commercial at sign |
65 A |
66 B |
67 C |
68 D |
69 E |
70 F |
71 G |
72 H |
73 I |
74 J |
75 K |
76 L |
77 M |
78 N |
79 O |
5 |
80 P |
81 Q |
82 R |
83 S |
84 T |
85 U |
86 V |
87 W |
88 X |
89 Y |
90 Z |
91 [ left square bracket |
92 \ backslash, reverse solidus |
93 ] right square bracket |
94 ^ spacing circumflex accent, caret, up-arrow |
95 _ spacing underscore, low line, horizontal bar |
6 |
96 ` spacing grave accent, back apostrophe |
97 a
|
98 b
|
99 c
|
100 d
|
101 e
|
102 f
|
103 g |
104 h |
105 i |
106 j |
107 k |
108 l |
109 m |
110 n |
111 o |
7 |
112 p |
113 q |
114 r |
115 s |
116 t |
117 u |
118 v |
119 w |
120 x |
121 y |
122 z |
123 { left brace (curly bracket) |
124 | vertical bar |
125 } right brace (curly bracket) |
126 ~ tilde accent |
127 DEL delete |
33から126までの文字が印字可能文字である。
0x5Cの文字は、日本語フォントでは円記号「\」として表示されるが、欧文フォントでは「バックスラッシュ"\"」として表示される。
- 1966
ISO R 646 制定
6bit系と7bit系(ASCIIとほぼ同じ)の二つを併記した国際規格
- 1969
JIS X 201 (JIS C 6220)制定
情報処理という分類『X』が1987年に出来るまでは、コンピュータは電気製品の分類『C』に入っていた。
ちなみに、番号の200番台が文字コード関連の規格。
7bit系と8bit系の二つがある。
7bit系は128文字の文字セット二つからなり、ひとつはISO 646と同じ規格であるが、もうひとつは
制御文字の後ろの領域にカタカナが配置されている。
8bit系はその二つの文字セットをくっつけたもの。前の領域に7bit系の一番目の文字集合、その後ろに7bit系の二番目の文字集合
というように配置。Alphabet,Numeric,Katakanaの頭文字を取ってANK文字と呼ばれる
- 1973
ISO 646 制定\
R(recommendation)がとれて、7bit案に統一
23h,24h,5Bh-5Ehは国別に独自の文字を割り当てる。
日本では、5Ch(ASCIIのバックスラッシュのコードポイント)に円記号"\"、
7Eh(ASCIIのチルドのコードポイント)にオーバーラインを割り当てている。
- 1978
JIS X 208 制定
- 1982
アスキーマイクロソフト社が開発したMS-Kanjiコード(シフトJIS)を、
国産初の16bitパソコン、三菱電機MULTI 16に内部コードとして搭載。
以後、MS-DOSが16bitパソコンの標準的OSになると共に、外部コードと
しても使われるようになる。
- 1983
JIS X 208-1983 改訂
新しい漢字95文字を第一水準に追加、第一水準と第二水準の新旧字体22
文字のコードポイントの変更、250字の字形の変更など大幅な改定が行われる。
このため新JISと旧JISという二つの文字セットが同時に使われることになる。
- 1987
-
ISO 8859-1
1バイトの国際共通文字コードPart-1
元々は西欧圏の言語を表示するための8bit系の内部コードとして作られた
もので、非常に普及したので、外部コードとしても使われるようになった経緯
を持つ
JIS X 201の8bit系と似た構造になっている。GL領域はASCII文字、GR領域
に西欧圏言語特有の文字を入れてある
現在はGL領域だけを、東欧圏言語、地中海諸国圏言語、バルト海諸国圏言
語、黒海諸圏国言語などに変えたものが、Part-10まで出来ている。
- 1990
JIS X 212 制定
JIS X 208の補助漢字として5801字収録
JIS X 208-1990 改訂
第二水準に2字追加、145文字の字形変更
- 1997
JIS X 208-1997 改訂
シフトJISに関する規定が盛り込まれる。
参考サイト
rain
BZE13657@nifty.ne.jp