文字化け対策
文字化けとは、いろいろなところで定義されていますから、ここで改めて説明する必要はないでしょう。
ようするに、こちらの意図していない文字が表示されてしまう現象のことですね。
原因としては、コンピュータ側の文字コードの読み間違いや、文字コード自体が破壊されている場合などもあります。
Perl/CGIプログラムで起こる文字化けのほとんどは、文字コードの読み間違いが原因で発生します。
このページでは、そんな文字化けにどう対処していけばよいのかということを、簡単に解説していきます。
文字化けの再現
では実際に文字化けを起こしてみましょう。
サンプルプログラムにアクセスしてみてください。
文字化けが起こっていることが確認できます。
#!/usr/bin/perl
print "Content-type: text/html; charset=shift_jis\n\n";
print "表示";
exit;
Perl/CGIスクリプトはこんな感じです。
「表示」という文字列は、Shift_Jisコードで出力する際、文字化けが発生する超有名な文字列です。
文字化けの原因
Perl/CGIプログラムで文字化けが発生する原因のひとつに…。
このサンプルプログラムのように、Shift_Jisコードで作成してしまったときに起こるというのがあります。
Shift_Jisコードというのは、半角カタカナ文字が16進コードひとつ(1バイト)で表現できるようになっているからです。
これだけでは何のことだかわからないと思うので、詳しく説明しますね。
Shift_Jisコードのすべての半角文字(英数字、記号やカタカナ)は、16進数1つ(1バイト)で表現されます。
これに対しそのほかの全角文字(英数字、ひらがな、カタカナ、漢字や記号)は、16進2つ(2バイト)で表現されます。
16進数変換ツールのShift_Jisコードのページで、いろいろなタイプの文字を入力していただければわかると思うのでここまではOKですね。
問題はここからです。
Shift_Jisコードの中で、1バイトで表現できる文字群と、2バイトで表現できる文字群…。
上記の振り分け方では、不自然なところがありますよね。
まぁ普通に見ると、半角文字は1バイト、全角文字は2バイトなので、おかしなところは何もなさそうなんですが…。
パソコンの処理という側面から考えた場合、急におかしなところが見えてくるようになります。
それは、半角カタカナが1バイトで表現されているというところです。
パソコン(コンピューター)というのは、アメリカで大きく発展したという影響もあり、文字のベースが半角英数と半角記号になっています。
なのでこれらの文字が、1文字1バイトで表現されるというのは理にかなっています。
しかし、半角カタカナまで1バイトで表現されているのはおかしいのです。
ほかの文字コードの場合、EUC-JPでは2バイト、UTF-8では3バイトで表現されています。
これは、文字を誤って解釈してしまうことを避けるためにそうなっています。
けっして、文字コードの定義ミスなんかではありません(笑)。
その証拠に、半角カタカナを1バイトで表現しているShift_Jisコードでは、それが原因で読み取り間違いを起こし文字化けするケースが多々あります。
よくあるのが、2バイト文字で表現されるShift_Jisコード文字の一部が、半角カタカナであると判断されるパターンです。
EUC-JPやUTF-8では、1バイト文字を半角英数と記号といった既存の文字のみにして、日本語を表現するのに便利な文字群は、すべて複数のバイト数を使用するようになっています。
なので、EUC-JPやUTF-8コードでは、ほとんど文字化けは起こりません。
これが、Shift_Jisコードが文字化けを起こしやすいといわれている原因です。
<戻る>
文字化け対策(その1)
ここで紹介する方法が、たぶんいちばん簡単なやりかたです。
設置したサンプルプログラムを見てください。
文字化けが解消されていますよね。
Perl/CGIスクリプトはこんな感じです。
#!/usr/bin/perl
print "Content-type: text/html; charset=shift_jis\n\n";
print '表示';
exit;
どのようにして文字化けを解消したかというと…。
print関数の引数つまり、出力するデータ部分を「'」にしました。
引数データ部分を「'」でくくることにより、そのデータは、Perl/CGIプログラム側で解釈されることなく出力されます。
つまり、「"」で変数をはさんだときには、その変数内の値が出力されますよね。
しかし、「'」で変数をはさんだ場合は、変数内の値ではなく、その変数名が出力されます。
この性質を利用し、勝手に解釈されてわ困る文字列「表示」を出力させています。
文字化け対策(その2)
次は、まぎらわしい全角文字は使わず、半角文字のみですべての文字を表現する方法を紹介します。
設置したサンプルプログラムを見てください。
文字化けが解消されていますよね。
Perl/CGIスクリプトはこんな感じです。
#!/usr/bin/perl
print "Content-type: text/html; charset=shift_jis\n\n";
print "表示";
exit;
どのようにして文字化けを解消したかというと…。
数値文字参照ツールを使いました。
どこにも「表示」とは書かれていませんよね。
間違って解釈される恐れのある全角文字をまったく使っていないので、文字化けは発生しないのです。
<戻る>
文字化け対策(その3)
次は、文字コード自体を変更して、文字化けを回避する方法を紹介します。
設置したサンプルプログラムを見てください。
文字化けが解消されていますよね。
Perl/CGIスクリプトはこんな感じです。
#!/usr/bin/perl
print "Content-type: text/html; charset=euc-jp\n\n";
print "表示";
exit;
どのようにして文字化けを解消したかというと…。
Shift_Jisコードでは文字化けを起こしやすいので、別の文字コードを採用してみました。
ここでは、EUCコードを使っています。
なので、上記のPerl/CGIスクリプトをコピーしてあなたのサーバー環境で実行するときには、事前にEUCコードに変換しておく必要があります。
EUCコードや、UTF-8コードを使うと、Shift_Jisコードで文字化けしていた文字を正常に表示させることができます。
文字化け対策(その4)
最後は、外部ファイルから文字を読み込むことにより文字化けを回避する方法を紹介します。
設置したサンプルプログラムを見てください。
文字化けが解消されていますよね。
Perl/CGIスクリプトはこんな感じです。
#!/usr/bin/perl
use strict;
open (IN, './string.txt');
my $string = <IN>;
close (IN);
print "Content-type: text/html; charset=shift_jis\n\n";
print $string;
exit;
どのようにして文字化けを解消したかというと…。
外部ファイル「string.txt」から、文字列「表示」を読み込んで出力させています。
このように、文字列を読み込んでprint関数で直接出力させると、文字化けを回避することができます。
以上が、簡単にできる文字化け対策法です。
Perl/CGI開発環境に合わせて、あなた好みのものを使ってみてください。
<戻る>