[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

コンピュータIID(UNIXとHTML)第7回

目次
7.1 ファイル・タイプ
7.1.1 ファイルの中身
7.1.2 ファイルの種類
7.2 文字コード
7.2.1 テキスト・ファイルとバイナリ・ファイル
7.2.2 英語の文字コード
7.2.3 日本語の文字コード
7.2.4 日本語EUC
7.2.5 JISコード
7.2.6 シフトJIS
7.2.7 国際的な文字コード
7.2.8 UTF-8
7.2.9 改行コード
7.3 演習7
7.4 レポート課題
7.5 参考文献
索引

7.1 ファイル・タイプ

7.1.1 ファイルの中身

パソコンで取り扱うあらゆるデータは、ファイルに保存することができます。 ワープロ文書や表計算データだけでなく、画像データや音楽データ、動画データなどもファイルに保存できます。 このことは、WindowsでもMacでもUNIXでも同じです。

さて、何でも保存できるファイルの中身は、一体どうなっているのでしょうか。 実は、ファイルの中身は、0と1を並べたものにすぎません。 この0と1を ビット と呼びます。 ただ、ビットはあまりにも小さいので、今のパソコンは8ビットを基本単位にしています。 この8ビットを バイト と呼びます。 つまり、ファイルの中身はバイトの列なのです。

ここで、以下の内容をファイルenglish01.txtに保存します。

This is a pen.
Is this a pen?
Yes, it is.

odコマンド (Octal Dump)は、ファイルの中身を数バイトごとに表示します。 1バイトごとに表示する場合の形式は

od -b file

です。

asiaa1:~ b08a001$ cd comp2d
asiaa1:~/comp2d b08a001$ cat english01.txt
This is a pen.
Is this a pen?
Yes, it is.
asiaa1:~/comp2d b08a001$ od -b english01.txt
0000000 124 150 151 163 040 151 163 040 141 040 160 145 156 056 012 111
0000020 163 040 164 150 151 163 040 141 040 160 145 156 077 012 131 145
0000040 163 054 040 151 164 040 151 163 056 012
0000052
asiaa1:~/comp2d b08a001$

このコマンドで、0と1の列が表示されるべきですが、実際は0〜7の列が表示されます。 これを解読するには、2進数と8進数を理解する必要があります。

2進数 とは、0と1の列で表現される数です。 8進数 とは、0〜7の列で表現される数です。

3桁の8進数を8桁の2進数に変換するには、以下の表にしたがって8進数を2進数に置き換え、9桁の2進数にしてから最も左の桁を取り除きます。 例えば、8進数の124は、001 010 100に置き換えられ、2進数の01 010 100となります。

逆に、8桁の2進数を3桁の8進数に変換するには、左に0を追加し、以下の表にしたがって2進数を8進数に置き換えます。 例えば、2進数の01010100は、001 010 100を置き換えて、8進数の124となります。

表 7.1  8進数と2進数の対応
8進数 2進数
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

さて、odコマンドが表示したものは8進数です。 したがって、ファイルenglish01.txtの中身は、124 150 151 ..., すなわち 01010100 01101000 01101001 ...であることが分かります。

7.1.2 ファイルの種類

パソコンのあらゆるデータがファイルに保存できるということは、逆に、ファイルを見ただけではどんなデータか分からないということです。 このため、利用者は、ファイル名に拡張子というものを追加します。 拡張子 とは、ファイルの種類の目印で、ドット(.)とアルファベット3文字程度で表されます。 よく使われるファイルについては、拡張子の書き方が決まっています。 重要なものは、以下の通りです。

表 7.2  重要な拡張子
ファイルの分類 ファイルの種類 拡張子
テキスト
ファイル
プレーン・テキスト .txt
HTMLファイル .html, .htm
スタイルシート .css
バイナリ
ファイル
画像ファイル(GIF形式) .gif
画像ファイル(JPEG形式) .jpeg, .jpg
画像ファイル(PNG形式) .png
画像ファイル(BMP形式) .bmp
画像ファイル(TIFF形式) .tiff, .tif
Wordファイル .doc
Excelファイル .xls
PowerPointファイル .ppt
PDFファイル .pdf
Windows実行ファイル .com
Windows実行ファイル .exe
圧縮ファイル(ZIP形式) .zip
圧縮ファイル(LZH形式) .lzh

ファイル名は利用者が自由に付けられますので、わざと関係のない拡張子を付けることも、可能といえば可能です。 また、何らかの事情でファイル名が化け、拡張子が消えることも考えられます。 そのようなファイルでも、次のコマンドを使えば、ファイルの種類を推測できます。

fileコマンド は、ファイルの中身を読み取り、その特徴からファイルの種類を推測し、結果を表示します。 形式は

file file

です。 紛らわしいファイルについては、間違った推測をすることもあります。 このコマンドは、ファイルの拡張子では判断しません。

asiaa1:~/comp2d b08a001$ file english01.txt
english01.txt: ASCII text
asiaa1:~/comp2d b08a001$

7.2 文字コード

7.2.1 テキスト・ファイルとバイナリ・ファイル

ファイルの種類は、テキスト・ファイルとバイナリ・ファイルの大きく2つに分類できます。 文字だけで構成されるファイルが テキスト・ファイル で、そうでないファイルが バイナリ・ファイル です。

バイナリ・ファイルの中身は、バイトの列ではありますが、ファイルの種類ごとに異なる、複雑な構成になっています。 したがって、この授業では取り扱いません。

一方、テキスト・ファイルの中身は、比較的単純です。 基本的に、一文字一文字の文字コードを並べて構成されます。 ここで、 文字コード とは、文字をビット列に対応させたものです。

以下では、文字コードについて説明します。

7.2.2 英語の文字コード

まず、英語のテキストについて考えます。 アルファベットの大文字・小文字の52文字、数字10文字、各種記号を使ったとしても、文字として100種類もあれば十分です。

次に、1バイトで何通りのデータが表現できるかを考えます。 これは、順列・組み合わせの問題で、2×2×2×2×2×2×2×2=256通りです。

したがって、英語の場合、1文字を1バイトで表現するのが合理的です。

英語の文字コードでもっとも標準的なのは、ASCIIです。 ASCII (American national Standard Code for Information Interchange, アスキー)とは、アメリカで制定された文字コードです。 ASCIIでは、1文字を1バイトで表現します。 その大まかな分類は、次のようになります。

表 7.3  ASCIIのビット・パターン
ビット・パターン 範囲(8進数) 分類
000xxxxx 000〜037 制御文字
001xxxxx 040〜077 数字と各種記号
010xxxxx 100〜137 大文字と各種記号
011xxxxx 140〜177 小文字と各種記号

ここで、 制御文字 とは、空白や改行などのことです。 制御文字は表示できるものではありませんが、広い意味での文字と見なされます。

制御文字以外については、以下のようになります。

表 7.4  ASCII(制御文字以外)
文字 2進数(8進数) 文字 2進数(8進数) 文字 2進数(8進数)


@ 01000000(100) ` 01100000(140)
! 00100001(041) A 01000001(101) a 01100001(141)
" 00100010(042) B 01000010(102) b 01100010(142)
# 00100011(043) C 01000011(103) c 01100011(143)
$ 00100100(044) D 01000100(104) d 01100100(144)
% 00100101(045) E 01000101(105) e 01100101(145)
& 00100110(046) F 01000110(106) f 01100110(146)
' 00100111(047) G 01000111(107) g 01100111(147)
( 00101000(050) H 01001000(110) h 01101000(150)
) 00101001(051) I 01001001(111) i 01101001(151)
* 00101010(052) J 01001010(112) j 01101010(152)
+ 00101011(053) K 01001011(113) k 01101011(153)
, 00101100(054) L 01001100(114) l 01101100(154)
- 00101101(055) M 01001101(115) m 01101101(155)
. 00101110(056) N 01001110(116) n 01101110(156)
/ 00101111(057) O 01001111(117) o 01101111(157)
0 00110000(060) P 01010000(120) p 01110000(160)
1 00110001(061) Q 01010001(121) q 01110001(161)
2 00110010(062) R 01010010(122) r 01110010(162)
3 00110011(063) S 01010011(123) s 01110011(163)
4 00110100(064) T 01010100(124) t 01110100(164)
5 00110101(065) U 01010101(125) u 01110101(165)
6 00110110(066) V 01010110(126) v 01110110(166)
7 00110111(067) W 01010111(127) w 01110111(167)
8 00111000(070) X 01011000(130) x 01111000(170)
9 00111001(071) Y 01011001(131) y 01111001(171)
: 00111010(072) Z 01011010(132) z 01111010(172)
; 00111011(073) [ 01011011(133) { 01111011(173)
< 00111100(074) \ 01011100(134) | 01111100(174)
= 00111101(075) ] 01011101(135) } 01111101(175)
> 00111110(076) ^ 01011110(136) ~ 01111110(176)
? 00111111(077) _ 01011111(137)

ASCIIの内容は、オンライン・マニュアルで見られます。 man asciiと入力してください。 最初の"The octal set"の部分が、8進数です。

odコマンドで、ファイルをASCIIと見なして表示するには、

od -c file

とします。

英文テキストの場合、od -c コマンドで、テキストがほとんどそのまま表示されます。

asiaa1:~/comp2d b08a001$ cat english01.txt
This is a pen.
Is this a pen?
Yes, it is.
asiaa1:~/comp2d b08a001$ od -b english01.txt
0000000 124 150 151 163 040 151 163 040 141 040 160 145 156 056 012 111
0000020 163 040 164 150 151 163 040 141 040 160 145 156 077 012 131 145
0000040 163 054 040 151 164 040 151 163 056 012
0000052
asiaa1:~/comp2d b08a001$ od -c english01.txt
0000000    T   h   i   s       i   s       a       p   e   n   .  \n   I
0000020    s       t   h   i   s       a       p   e   n   ?  \n   Y   e
0000040    s   ,       i   t       i   s   .  \n
0000052
asiaa1:~/comp2d b08a001$

7.2.3 日本語の文字コード

すでに説明した通り、1バイトで表現できるデータは256通りです。 日本語の場合、漢字がたくさんありますので、256通りでは間に合いません。 2バイトにしますと、256×256=65536通りになりますので、これなら十分表現できます。 日本語の文字コードは、1文字を2バイトで表現します。

日本語だけを使うのでしたら、日本語の文字コードは、1文字2バイトを並べるだけで済みます。 しかし、ASCIIの文字、つまり数字やアルファベットも同時に利用できないと困ります。 その要求を満たす方法が3種類あり、日本語の文字コードは3種類になっています。

7.2.4 日本語EUC

第1の文字コードは、 日本語EUC (Extended Unix Code)です。 これは、最も左のビットが1のバイトを2バイト使うものです。 ASCIIの最も左のビットは0ですので、最も左のビットを見れば、ASCII文字と日本語EUC文字の区別ができます。

表 7.5  日本語EUCのビット・パターン
ビット・パターン 範囲(8進数) 分類
0xxxxxxx 000〜177 ASCII
1xxxxxxx 1xxxxxxx 200〜377 200〜377 日本語の文字

日本語EUCは、主にUNIXで使われます。

ここで、以下の内容のファイルjapanese01.txtを作成します。 保存するときは、エンコーディングは「日本語(EUC)」、改行タイプは「Unix(LF)」にします。

東京女子大学

odコマンドで、このファイルの中身を表示します。

asiaa1:~/comp2d b08a001$ od -b japanese01.txt
0000000   305 354 265 376 275 367 273 322 302 347 263 330 012
0000015
asiaa1:~/comp2d b08a001$

文字とバイトの対応は、次のようになります。 ASCII文字(8進数で000〜177)が全く使われていないことに注意してください。

東 = 305 354
京 = 265 376
女 = 275 367
子 = 273 322
大 = 302 347
学 = 263 330
改行 = 012

7.2.5 JISコード

第2の文字コードは、 JISコード (ジスコート)または ISO 2022-JP と呼ばれるものです。 この文字コードでは、日本語の1文字を、ASCIIの2文字に対応させます。 そして、日本語開始を表す3バイトと日本語終了を表す3バイトを定義し、これに囲まれた部分を日本語と見なすのです。 具体的には、日本語開始は 033 044 102, 日本語終了は 033 050 102 です。 033は制御文字なので、ASCII文字とJIS文字の区別ができます。

表 7.6  JISコードのビット・パターン
ビット・パターン 範囲(8進数) 分類
0xxxxxxx 000〜177 ASCII
0xxxxxxx 0xxxxxxx 000〜177 000〜177 日本語の文字

JISコードは、主に電子メールで使われます。

ここで、ファイルjapanese01.txtを「日本語(ISO 2022-JP)」(=JIS)で保存しなおします。

asiaa1:~/comp2d b08a001$ od -b japanese01.txt
0000000   033 044 102 105 154 065 176 075 167 073 122 102 147 063 130 033
0000020   050 102 012
0000023
asiaa1:~/comp2d b08a001$

文字とバイトの対応は、次のようになります。 全てASCII文字(8進数で000〜177)であることに注意してください。

日本語開始 = 033 044 102
東 = 105 154
京 = 065 176
女 = 075 167
子 = 073 122
大 = 102 147
学 = 063 130
日本語終了 = 033 050 102
改行 = 012

7.2.6 シフトJIS

第3の文字コードは、 シフトJIS です。 これは、1バイトの半角カタカナも、2バイトの日本語文字も使えるようにしたものです。

日本のパソコンは、漢字が使えるまでは、ASCII文字と半角カタカナを使っていました。 半角カタカナのビット・パターンは、101xxxxxと110xxxxxでしたので、ASCII文字とは区別ができました。 やがて漢字が使えるようになり、2バイトの日本語文字を、ビット・パターンのすきまに割り当てたのがシフトJISです。 ビット・パターンをよく見れば、ASCII文字、半角カタカナ、シフトJIS文字の区別ができます。

表 7.7  シフトJISのビット・パターン
ビット・パターン 範囲(8進数) 分類
0xxxxxxx 000〜177 ASCII
100xxxxx xxxxxxxx 200〜237 000〜377 日本語の文字
101xxxxx 240〜277 半角カタカナ
110xxxxx 300〜337 半角カタカナ
111xxxxx xxxxxxxx 340〜377 000〜377 日本語の文字

シフトJISは、主にWindowsとMacで使われます。

ここで、ファイルjapanese01.txtを「日本語(Windows)」(=シフトJIS)で保存しなおします。

asiaa1:~/comp2d b08a001$ od -b japanese01.txt
0000000   223 214 213 236 217 227 216 161 221 345 212 167 012
0000015
asiaa1:~/comp2d b08a001$

文字とバイトの対応は、次のようになります。 部分的にASCII文字(8進数で000〜177)が使われていることに注意してください。

東 = 223 214
京 = 213 236
女 = 217 227
子 = 216 161
大 = 221 345
学 = 212 167
改行 = 012

7.2.7 国際的な文字コード

インターネットの普及にともない、世界中の文字を同時に利用することも考えなければならなくなりました。 ここで、問題になるのが、文字数の多い漢字です。 東アジア各国で使われている漢字をそのまま集めますと、数十万にもなってしまいます。 しかし、それらを頑張ってまとめますと、なんとか2バイト(65536通り)に収まります。 このようにして、世界中の文字を2バイトで表現したものが、 Unicode (ユニコード)です。

7.2.8 UTF-8

Unicodeだけを使うと決めてしまえば、国際的な文字コードは、1文字2バイトを並べるだけで済みます。 しかし、やはりASCIIも使えないと困ります。 その要求を満たすのが、 UTF-8 (Unicode Translation Format)です。

UTF-8では、世界中の文字を2バイトか3バイトで表現します。 いくつかの言語が2バイトに割り当てられ、残りが3バイトです。 日本語の文字は、ほとんどが3バイトになります。 ビット・パターンをよく見れば、ASCII文字、2バイト文字、3バイト文字の区別ができます。

表 7.8  UTF-8のビット・パターン
ビット・パターン 範囲(8進数) 分類
0xxxxxxx 000〜177 ASCII
110xxxxx 10xxxxxx 300〜337 200〜277 世界中の文字
1110xxxx 10xxxxxx 10xxxxxx 340〜357 200〜277 200〜277 世界中の文字

UTF-8は、主にインターネットで使われます。 また、最近のWindows, Mac, UNIXでは、部分的にUTF-8を取り入れています。

ここで、ファイルjapanese01.txtを「Unicode(UTF-8)」で保存しなおします。

asiaa1:~/comp2d b08a001$ od -b japanese01.txt
0000000   346 235 261 344 272 254 345 245 263 345 255 220 345 244 247 345
0000020   255 246 012
0000023
asiaa1:~/comp2d b08a001$

文字とバイトの対応は、次のようになります。 ASCII文字(8進数で000〜177)が全く使われていないことに注意してください。

東 = 346 235 261
京 = 344 272 254
女 = 345 245 263
子 = 345 255 220
大 = 345 244 247
学 = 345 255 246
改行 = 012

ここで、ウェブ・ページなどで時々発生する「文字化け」と呼ばれる現象について考えます。 今、「東京女子大学」という文字列を含むファイルを、文字コードをUTF-8にして保存したとします。 ファイルには、346 235 261(= 東)344 272 254(= 京)...というバイトの列が書き込まれます。 このファイルを、文字コードがシフトJISであると予想して開いたとします。 すると、「東京女子大学」ではない、全然違う文字列になってしまいます。 なぜなら、シフトJISで「東京女子大学」は、223 214 213 236 ...というバイトの列だからです。 このように、文字コードを間違って開き、全く異なる文字に解釈されるのが、文字化けなのです。

7.2.9 改行コード

今までの例では、改行の文字コードは012でした。 実は、標準的な改行コードは、OSごとに異なります。 具体的には、以下の通りです。

表 7.9  OSごとの改行コード
OS 改行コード
Windows 015 012
Mac 015
UNIX 012

7.3 演習7

まず、「東京女子大学」の代わりになる日本語テキストを自分で考えてください。 そして、そのテキストを、エンコーディングは「日本語(EUC)」、改行タイプは「Unix(LF)」として、ファイルjapanese02.txtに保存してください。 最後に、odコマンドでそのファイルの中身を表示し、どの文字がどのバイトに対応しているかを説明してください。

エンコーディングを「日本語(ISO 2022-JP)」(=JIS)にして保存した場合、「日本語(Windows)」(=シフトJIS)にして保存した場合、「Unicode(UTF-8)」にして保存した場合の、それぞれについても、同様に説明してください。


7.4 レポート課題

今日の演習7の答案(「ターミナル」画面のコピーとその説明文)をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(11月14日)を明記してください。


7.5 参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2008年11月14日更新
小西 善二郎 <konishi@cis.twcu.ac.jp>
Copyright (C) 2008 Zenjiro Konishi. All rights reserved.