Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

日本語文字コードの研究

研究内容

ブラウザから日本語が送られてくるときの文字コードについて研究します。

詳細

文字コード

文字は、コンピュータの中では数値で表されてるんでした。 例えば、A が 65。これ何回か出てきましたよね。 こういう風に、数値と文字を対応させるためには、もちろん、 数値と文字との対応表みたいなルールが必要です。 それが文字コードです。

半角英数字の場合、文字コードについて意識する必要はありません。 半角英数字はどんな文字コードでも同じように数値と対応しているので、 問題にならないんですね。でも、全角文字の場合はちょっと違います。 日本語にはいくつか文字コードっていうのがあって、 s-jis(shift-jis、シフトJIS)とか、EUCとか、Utf-8とか、 あんまりよく知らないのですが、 そんな感じで同じ日本語なのに文字コードが複数あるんです。 例えば、前回の研究で あ が %82%A0 になるっていうのがありましたが、 これはs-jisの場合です。 s-jisでは、あ が %82%A0 に対応しているっていうことですね。 でも、EUCとかUtf-8の場合、あ は 違う数値に対応してるんですよ…。 そのおかげで、いろいろ面倒なことが起きてきます。

文字コードで困ること

文字コードで困るのは、ブラウザからデータが送られてくるとき、どの文字コードで 送られて来たのか分からないっていうことです。 文字コードが分からないと、数値から元の文字に戻すことができないわけですから。

でも、前回、デコードを行うようにして日本語も受け取れるようになりましたね。 別に、文字コードとか気にしていませんでした。 それじゃなんでちゃんと日本語を受け取れたのかっていうと、 このサイトは全部s-jisで作ってあるからです。 パソコンの場合、普通にメモ帳でテキストを書くとs-jisになります。 で、ブラウザは、データを送信するとき、現在表示している文字コードで 情報を送信するみたいなんです。 なので、日本語がs-jisで届いて、何の問題もなく認識できたみたいです。

それなら、なんの問題も無いんじゃ?ということに なりますが、そうとは言い切れません。s-jisのページにあるフォームからは 必ずs-jisでデータが送信されるっていう決まりはないんです。 上に書いたことは、実は単なる予想です (^^; ページがs-jisだから、 送られてくるデータもs-jisになったんだろうと。

ということは、ページがEUCならEUCで、ページUtf-8ならUtf-8でデータが送られて くるはずですよね?とりあえず、それをちょっと確認してみましょう。

結果

送られてくるデータを調べる

送られてきたデータの文字コードを調べたいわけですが、 それってどうしたらいいんでしょうか? その方法として、ブラウザを使いましょう。 ブラウザには、文字コードを選択する機能がありますよね。 InternetExplorerの場合、メニューの[表示]−[エンコード]で 文字コードを変更できます。

CGIプログラムでは、受け取ったデータをデコードした後、文字コードを 気にせずに画面に表示します。画面に表示された文字をちゃんと読めるように、 ブラウザの文字コードを変更してください。読めた文字コードが、 CGIプログラムに送られてきた文字コードだということになります。

それでは、s-jis、EUC、Utf-8の3つの文字コードのページを作りました。 それぞれ、フォームがありますので、なにか日本語を入力してSUBMITボタンを 押してください。開いたページを、ブラウザがどの文字コードで表示したのかを 確認してください。

Shift-JIS のフォーム
EUC のフォーム
Utf-8 のフォーム
結果

試してみると、確かに、フォームが置かれたページの文字コードでデータがCGIプログラムに 送られてきていました。

それじゃ文字コードは気にしなくてもいい?

ということは、s-jisで作ってあるサイトに設置した フォームからは、s-jisでデータが送られてくるということで安心していていいんでしょうか?

いや、安心するにはまだ早いんです。 管理人がテストしたのはWindowsのInternetExplorerだけです。それもVersion6のみ。 他のブラウザでもこれが成り立つのかどうかは分からないわけです。 フォームが置かれたページの文字コードでデータ送られるという保証はありません。

それじゃ文字コードを判別して変換する?

文字コードを何も処理しないでおくと、もしかしたら文字化けが起こるかも知れません。 ということで、これを未然に防ぐために、いいものがあるんです! かの有名な、文字コード自動変換ライブラリjcode.pl でございます。 これを使わせて頂いて、どんな文字コードでデータが送られてきても 平気なようにしましょう!

ちょっと待って!それでも文字化けするらしいです

文字コードについてネットで調べていて、面白い記事を見つけました。

フォームから受け取る日本語の文字コード (元記事削除につきリンク切れです)

引用させて頂くと、「特にいわゆる半角カナを含む場合には正確に文字コードを 判別することは難しく、判別処理自体が文字化けの原因になる」んだそうです。 文字化けを回避するために文字コードの自動判別と自動変換を行おうとすると、 それが原因で文字化けしてしまうという本末転倒な悲しい現象が起こるとおっしゃっております。 s-jisで来たものを他の文字コードにわざわざ変えちゃったりするっていうことですね。

うーん…

文字化けしてから考えましょう…

つまり、どちらにしても文字化けの可能性は無くならないっていうことですね。

それじゃ、とりあえず文字コードについてはなにも処理しないことにしましょう。 で、サイトを作るときはウェブページからなにから全てs-jisで作るようにして、 フォームからs-jisでデータが送信されてくる限り、正しく動くようにしておくと。 それでうまくいけばOKです。

もし、そうして文字化けが起きるような状況に出会ったら、その時にまた研究すればいいと思います。 どういう状況で文字化けが起こるのかっていう勉強にもなりますし、 その方が、ずっと勉強になるかも知れません!

ということで、今回の研究はCGIプログラムを作らずに終わりです。 そして、ということは、前回のデコードの研究で、 フォームデータ取得関数 getformdata は完成したってこと ですね!長かった…。ようやく一段落です。これからは、この関数を使って フォームからのデータを取得して、いろんなことをしていきたいと思います。

研究メモ

  1. フォームから全角文字はエンコードされて送られますが、
    この時使用される文字コードはそのフォームが置かれていたページの文字コードらしいです。
    でもそれは保証されているわけではないようです。
  2. 頑張って作ったgetformdata関数はいまのところ文字コードに関する処理をなにもしていませんので、
    もしかしたら文字化けが起きるかも知れません。
  3. 文字コード自動判別は100%確実というわけではなくてミスすることもあるそうです。
    なので文字コード自動判別が文字化けの原因になってしまうこともあるそうです。
  4. どちらにしても文字化けの可能性があるのなら、とりあえず何もしないでおくのが良さそうです。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。