2012/09/23

文系のための「デジタルデータ」(2)

どうやら、コンピュータは「1」と「0」の信号で動いている、ということは解った。
では、実際にはどのように信号のやり取りをしているのか?

まずは、「色の情報」をどのようにして扱っているかを整理する。
実際には、様々な方法があるのだけれど、
話を簡単にするために、「RGB」による指定方法を例に解説する。

おそらく、「色の三原色」という言葉を聞いたことの無い人は居まい。
そうそう。「赤(Red)」と「緑(Green)」と「青(Blue)」の三色で、
あらゆる色を表現できるという「アレ」。聞いたことくらいはあるだろう。

コンピュータの中でも、この三原色を使って色を表現する。
一般的には、の色の強さを、それぞれ、「0〜255」の256段階で指定し、
この3つの色を合成して、色を表現する

うん?なぜ、256段階なのか?実は、これが重要なポイント

実は、この値こそが、「1」と「0」の世界を象徴しているのである。
とりあえず、下の表を見てみる。これは、の値が取り得る範囲を示している。

三原色 2進数 16進数 10進数
赤: 0000 0000 〜1111 1111 ⇒ 00〜FF  ⇒ 0〜255
緑: 0000 0000 〜1111 1111 ⇒ 00〜FF ⇒ 0〜255
青: 0000 0000 〜1111 1111 ⇒ 00〜FF ⇒ 0〜255

まずは、2進数の場合:
例えば、赤色を表示したい場合には、「1111 1111 0000 0000 0000 0000」となる。
例えば、灰色を表示したい場合には、「1001 1001 1001 0001 1001 0001」となる。

次に、16進数の場合:
例えば、赤色を表示したい場合には、「FF 00 00」となる。
例えば、灰色を表示したい場合には、「99 99 99」となる。

ちなみに、10進数の場合
例えば、赤色を表示したい場合には、「RGB(255, 0, 0)」となる。
例えば、灰色を表示したい場合には、「RGB(153, 153, 153)」となる。

はて?2進数...16進数...10進数...何のことやら?

我々は、「10を一つの単位をし、9まで数えたら桁を繰り上げる数を使うことが多い。
これを一般的に「10進数」と呼ぶ。これも聞いたことくらいはあるハズ。
ちなみに、時計は60を単位としているので、60進数と呼ぶ。これは、常識

数学の世界では、数を数える方法には、いくつかの方法が存在している。
2進数というのは、つまりは、0と1で表す方法
1を単位とし、1まで数えたら次に「10」となるような数え方

一般的に、この2進数1桁分ビット(bit)と呼ぶ。
上の例だと、がそれぞれ8bitで表されていて、
それらを組み合わせた色は、24bitで表現できる。

24bitでそんなに多くの色を表現できるハズが無い!」と言う人がいるかもしれないが、
実際に、どの程度の色が表現できるのかというと、
なんと、「2の24乗」で「16,777,216 色」もの組み合わせが出来るのである。

さて、上の表では、16進数というのも併記してある。これは何か?

16進数というのは、9まで数えると、A⇒B⇒C⇒D⇒E⇒Fと上がっていき、
「15」まで変えぜたら次に位が一つ上がって「10」になるような数値である。
10進数と区別できないので、「0x10」のように前に「0x」を付けるのが慣例。

実を言うと、コンピュータの世界では「2進数の代わり」に、
16進数を用いることが多い。2進数だと、桁を数えるのが大変であるし、
10進数だと2進数に変換するのが面倒。だから、16進数で表す。

うん?なぜ、16進数だと変換が楽なのか?
とりあえず、下の図を見てみる。

実は、2進数16進数には「面白い関係」があって、
2進数を「4桁」ずつに区切って「16進数」に置き換えることができるので、
0000〜1111までに対応する16進数さえ覚えておけば、それ以上を覚える必要はない。

最近では、すっかり、2進数16進数でデータを扱うことは少なくなったが、
現在でもエラーメッセージなどでは、16進数がコッソリと表示されているし、
マイコン開発などでは、今でも2進数や16進数でプログラムを書くことがある。

まぁ、マニアックな話なので、この話はいずれ...。
さて、話を元に戻して...。

コンピュータでは、多くの機器がこの方法で色を表現していて、
ディスプレイの表示も、結果的には、2進数の信号として扱われているのである。

なるほど。とりあえず、色のことは解った。

では文字はどのように表すのか?
意欲的な人は、そんな疑問を持つことであろう。
ということで、ここからが「本題」。

実は、文字の場合も同じ。結果的には2進数で表すことができる。
ただし、文字の場合は、2進数に変換可能な対応表のようなものを用意し、
この対応表を参照することで、文字を表示する。これが重要!

実際には、その対応表を参照する方法は様々で、
本格的なシステムを構築するためには、かなり詳しいことを知っておく必要があるのだが、
今回は、基本的な話だけ。

さてさて、コンピュータの世界では、「文字化け」という現象が生じるが、
実は、この原因は、要するに文字の対応表にある。
以下の話を知っておけば、回避できることも増えるハズ。

とりあえず、最も基本的な対応表を見てみる。
これは、「American Standard Code for Information Interchange」の略で、
ASCII(アスキー)」と呼ばれている文字コード。歴史は長いが、「超」基本


0 1 2 3 4 5 6 7 8 9 +A +B +C +D +E +F
0x00 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
0x10 DLE CD1 DC2 EC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
0x20 ! " # $ % & ' ( ) * + , - . /
0x30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
0x40 @ A B C D E F G H I J K L M N O
0x50 P Q R S T U V W X Y Z [ \ ] ^ _
0x60 ` a b c d e f g h i j k l m n o
0x70 p q r s t u v w x y z { | } ~ DEL

この文字コード表は、1960年代に標準化され、現在でも広く使われている。
アルファベットを含む128文字が定義されていて、その内、33文字は「制御文字」。
制御文字は、モニタやプリンタの制御に使うもので、今回は詳しい説明はしない

さて、試しに、「Hello」というのをこの文字コード表を使って表現してみる。

16進数:0x48 0x65 0x6C 0x6C 0x6F
2進数 :0100 1000 0110 0101 0110 1100  0110 1100 0110 1111

このように、コンピュータが扱える2進数に変換されている。中々、面白い。

ここで、注意しないといけないのが、大文字小文字区別が存在していること。
つまり、「Hello」と「hello」と「HELLO」は、それぞれ「全く異なる」信号となる。

紙の世界に慣れていると、この辺りの認識がちゃんとできないのであるが、
コンピュータの世界においては極めて重要な問題なのである。

さて、ここには、アルファベットしか存在していない日本語は?

実は、日本語はASCIIコードには含まれていないのである。
日本語を扱うための文字コード表は「」に存在している。
最も有名な文字コード表が「Shift_JISコード」と呼ばれる文字コード。以下は、その一部。


0 1 2 3 4 5 6 7 8 9 +A +B +C +D +E +F
0x00 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
0x10 DLE CD1 DC2 EC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
0x20 ! " # $ % & ' ( ) * + , - . /
0x30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
0x40 @ A B C D E F G H I J K L M N O
0x50 P Q R S T U V W X Y Z [ \ ] ^ _
0x60 ` a b c d e f g h i j k l m n o
0x70 p q r s t u v w x y z { | } ~ DEL
0x80 IND NEL SSA ESA HTS HTJ VTS PLD PLU RI SS2 SS3
0x90 DCS PU1 PU2 STS CCH MW SPA ESP CSI ST OSC PM APC
以下の英数字は「JIS漢字」に含まれる
0x8240  
0x8250
0x8260
0x8270
0x8280
0x8290  
文字化けの原因となる使用禁止の文字
0xA0  
0xB0 ソ
0xC0
0xD0 °




0x8740
0x8750
0x8760
0x8770  
0x8780
0x8790

実は、Shift_JISでは、最初の部分がASCIIコードと同じで、
後ろの部分に、日本語特有の文字を加えている

まず、注意してもらいたいのが、「JIS漢字」と呼ばれる部分に定義されている文字。
この部分には、全角の数字とアルファベットが含まれる。実は、「漢字扱い」なのである。
半角」と「全角」の英数は似て非なるもの全角英数は、日本が独自

次に、「文字化け」の原因となる部分。無意識に使っていないだろうか?
この部分は、機種依存文字と呼ばれる文字が定義されている部分。
正式に標準化されているのではなく、メーカーが勝手に定義している部分

以前は「機種依存文字」と呼ばれていたもので、
現在では、「環境依存文字」と呼ばれているもの。
文系理系を問わず、常識として知っておいた方が良い。

見た目に惑わされて、この部分の文字を好んで使う人は非常に多いが、
日本製のソフトウェア以外は、対応していないことが多い。

データベースを構築したり、ホームページを作るときにもエラーの原因となる。
ましてや、この部分の文字を組み合わせた」などは、言語道断!
文字化け」が発生した場合に、元に戻せない。

この問題の「おかげ」で、私は、一体どれほどの無駄な時間を費やしたことか...。
注意しても、誰も聞いてくれない...文書化までしたのに...。そんな人とは仕事をしない...。
ましてや、ボランティアで対応できるような問題じゃない!

っと、まぁ、開発者に、そういったことを言わせないための知識と対策は必要かと。

さて、Shift_JIS の場合、「0x8540~ 0x889e」は、環境依存文字であり、
0xeb40~ 0xeffc」は、MacWindows との互換が無い部分。
そして「0xf040〜」は「外字」を定義する部分なので使ってはいけない。

そういえば、考古学文献学の人は、存在しない漢字を勝手に作ってしまう傾向にあるが、
そのような行為は、データを交換する上で大きな問題となってしまい、
システム技術者に非常に大きな負担をかけることになる。モラルとして...ね。

さて、日本語を扱える文字コード表は、Shift_JIS コードだけかというと、そうでは無い。
LinuxMac では、UTF-8 と呼ばれる文字コードを使っている。
これは、Unicode(ユニコード)と呼ばれる文字の一覧参照する方式

UTF-8 は、Shift_JIS と異なり、最初から国際化を前提としていて、
様々な国の文字を扱うことができるアラビア語ギリシア文字キリル文字なども。
実は、「文字化け」の問題を最小限に抑えるには、UTF-8 の方が無難

ところで、文字コードが間違って指定されたら何が起きるか?
Windows で作成したテキストが、Mac Linux で「文字化け」。よくある話。

以下は、簡単な例。

この例は、Windows の「メモ帳」でテキストファイルを作成し、保存したものを、
Mac で開いた例日本語のメッセージが完全に文字化けしている。
Windows ではShift JIS を使い、Mac ではUTF-8 を使っているのが原因。

あれ?と思った人もいるかもしれない。半角英数の部分は文字化けしていない

実は、Shift_JISUTF-8半角英数の部分に関しては、ASCII コードと互換があるので、
ASCII コードで定義された文字に関しては、文字化けが起きないのである。

フォルダやファイル名は、半角英数で書くのが基本中の基本」と言われるが、
実は、この問題を回避するため。日本語のファイル名は避けた方が良いのである。

とはいえ、ASCIIコードで定義されている領域であっても、記号類は避けた方が良い
記号類には、システム上で特殊な役割を担っている場合があるため。
安全なのは「_(アンダースコア)」だけ。コレ以外は、使わないのがマナー。

さて、Windows のメモ帳の場合であれば、実は、ファイルを保存するときに、
文字コードの指定というのができる。意外に知らない人が多いのだが。
とりあえず、以下のようにしておけば、Mac と Linux を使っている人には有難い

もちろん、ここで挙げた問題は、ホームページでも起こり得る話
実は、自治体のホームページに有りがち...。部署ごとにページを作っているのか、
ページによって、文字コードの指定が異なっていることもある。

こっちに合わすと、あっちで文字化け。あっちに合わすとこっちで文字化け...。

ふむふむ。不安な人は、LinuxMacホームページアクセスして確認を。
そうそう。そういったページは、iPad から見ても文字化けするのであった。どうだろう?

もちろん、Excel などでも、文字コードの気遣いが必要で、
特に、CSV形式などのテキスト形式で保存する時には、指定するべきである。
とは言うものの、私は、Excel での対処方法を知らない。そもそも、できるのか?

さて、本日のまとめ。

コンピュータは「1」と「0」で情報を扱う。
文字の場合は、文字コード表を参照し、そのコードを「1」と「0」に変換する。
文字コードを間違えて指定すると文字化けする

指定を間違える可能性は、大きく分けて二つ。
一つ目は、環境依存文字など、正式では無い文字コードを使った場合。
二つ目は、そもそも、異なる文字コード表を用いた場合(Shift-JIS とUTF-8など)

対策としては、環境依存文字を使わないように気を付けること。
また、他のシステムで見れるように、明示的に文字コードを指定すること。
おそらく、Shift-JIS よりも UTF-8 の方が無難である。半角英数は、もっと安全

0 件のコメント:

コメントを投稿