文字コード
Webページ作成ノート 目次 / rain's home page

文字コード・ノート

作成日: 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 208

1978年に制定された日本語を表すための符号化文字集合で、JISコードと呼ばれています。

7bit系2バイトの符号化文字集合で、上位バイト下位バイト共に、0x21から0x7Eまでの94個の コードポイントによって表されている。特徴をあげると、

区点コード

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

複数の文字セットを切り替える方法のISO規格
ISO 2022 には、8bit系と7bit系のエンコーディング法がある。

7bit系は、インユース・テーブル(実際に参照するアドレス空間)を制御文字領域C0と 図形文字領域GLに分ける。各文字集合を、G0、G1、G2、G3の四つ中間バッファに割り当てておき 、そのうえで各中間バッファをGLに呼び出すという手順を踏む。

8bit系は7bit系を二つ合わせたような構造になっている。インユース・テーブルの構成は 、制御文字領域C1と図形文字領域GRが加わり、C0、GL、C1、GRとなる。

G0をGRに呼び出すことは出来ない。

ISO 2022はこのように複雑な仕組みになっているため、これをすべて実装するのは 大変です。実際に使われる場合は、指示や呼び出しを固定するなどして簡略化したものを使っています。

日本語EUC

8bit系のISO 2022の簡略判が日本語EUCです。次のように 指示や呼び出しが固定されているので、エスケープシーケンスを使う必要がありません。

ISO-2022-JP

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バイトのカタカナ (いわゆる半角カタカナ)を使えないということです。

シフトJIS

8bitの単バイト文字( 8bit系JIS X 201、英数字・記号・カタカナ)と2バイト文字 (JIS X 208で定義された符号化文字集合)を一緒に使う方法。

7bit系しか受けつけないネットワークではそのままでは使えない。

単バイトのカタカナを生かすためにコード空間を分断してしまったので、 ISO 2022を使っての拡張が出来ない。つまりJIS X 201、JIS X 208以外の文字セットを使うことが出来ない。

以下はその方法である。

MIME

インターネット上には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の値としては次のようなものがあります。

MIME 関連文書

文字コード年表

1962

ASCIIコードがANSIの規格となる

ASCII:American national Standard Code for Infromation Interchange

『情報交換』という言葉が入っているのは、外部のコンピュータとデータをやりとりするための文字コード という意味で決められた。

ASCII コード表
 0123456789ABCDEF
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