おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

文字コード(1)

html文書と文字コード

文字化け対策

ウェブサイトを開けたとき日本語の部分が文字化けしていたという経験はありませんか?最近はその辺の対策がしっかりしているので、少なくなっていると思いますが以前は少なくないウェブサイトで文字化けが起こりました。これは文字コードに関係する現象です。後で詳しく述べますが、日本語の文字コードが複数あるため、ウェブサイトが使っている文字コードとブラウザの文字コードが違っていると文字化けします。

文字コードとは

PCの内部や、ネットワークの通信では、電気の信号でデータを保存したり、送ったりします。PCでは、+5V(プラス5ボルト)と0V(ゼロ・ボルト)が主に使われますが、+5Vだったら数字の1と判断し、0Vだったら数字の0と判断するというような具合です。このように1と0の区別できるものをビットといいます。ビットだと扱いにくいので、ビットを8つ集めて1纏まりにし、バイトといいます。
1 byte = 8 bits
そしてこれで、2の8乗通りの区別ができます。
2^8 = 256
これを8桁の2進数だと考えると、0から255までの数字ととらえることができます。PC内部ではこのように数字しか扱えず、直接文字を認識することができません。それで、文字に対応する数字を決めることでPC内部で文字を扱えるようにしました。これが文字コードです。初期の文字コードで有名なのはASCIIというコードです。これは7ビットのコードでしたので、128通りの区別がつきました。その中に大文字、小文字のアルファベットと(文字としての)数字と記号("や,など)、そして特殊文字(例えば改行を表す文字、ライン・フィードなど)を作りました。

日本語の文字コード

ASCIIコードでは日本語は扱えません。日本語で使う文字は大変多いので、16ビットで文字コードが作られましたが、その文字コードは何種類もありました。そうなってしまったのは歴史的、技術的な理由があります。一番の理由はASCIIコードとの互換性だったと思います。その点でShift_JISという文字コードがWindowsでは主流だった(今でもある程度そうかも)時期があります。LinuxではEUC-JPという文字コードが良く使われていました。しかし、それぞれの国でそれぞれの都合で文字コードを決めていると、世界全体としてはバラバラになってしまいますから、世界の言語で共通の文字コードがいずれは必要になってきます。その中でUnicode(ユニコード)が考案されました。ユニコードの中で一番使われているのは、UTF-8というコードです。これからは(すくなくとも当分の間は)UTF-8を使っていくことを心がけていくのが良いだろうと思います。

html、httpと文字コード

httpのヘッダには文字コードを指定するヘッダがあります。
Content-Type: text/html; charset=UTF-8
前回のcgiのサンプルのように、cgiの出力の最初にhttpヘッダを記述できますから、ここで文字コードをはっきり指定しておくと良いのです。
また、htmlの文書の中でもmetaタグを使ってhttpヘッダの指定ができます。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
このようにはっきりと文字コードを指定しておくことが文字化け防止では重要です。
FORMタグを用いてクライアントからサーバにデータを送る際も、文字コードを指定しておくことが大事です。
<form method="POST" action="http://www.sample.ac.jp/sample.cgi" Accept-charset="UTF-8"> 
このAccept-charsetの意味は、サーバとしては、UTF-8の文字コードを送ってくることしか許さないよ、という意味です。クライアントのブラウザがこれに従って、UTF-8でデータを送るべきですが、古いブラウザではサポートされていないことがありました。

html文書の文字コードはいつ決まるのか

html文書はエディタで作成し、ファイルに保存します。html文書の文字コードはファイルに保存するときに決まります。現時点でポピュラーなエディタは、保存時に文字コードを指定できるようになっています。保存の時点で、html文書の中で指定した文字コードと、エディタで保存時に指定した文字コードが違っていると確実に文字化けしますから注意しましょう。

まとめ

1 できる限り使用している文字コードを明示する。そのためには、cgiの出力するヘッダや、html文書のmetaタグ、FORMタグのAccept-charsetなどを使う
2 文字コードはUTF-8を使うようにする
3 文書の保存時に文字コードを正しく指定する