おもこん

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

文字コード(2)

cgi作成における文字コード

perlと文字コード

以前のperlでは、文字コードについてはきちんとしたサポートがありませんでした。そのためperl自身がもたらす文字化けがありました。有名なのはShift_JISを使ったダブルクォート文字列で文字化けするというものです。例えばダブルクォートで囲まれた"表示"という文字列が「侮ヲ」に文字化けするというものです。表示が表示できないというしゃれにならないものですが、その原因はShift_JISでは「表」を16進数で「95 5C」にするのですが、この「5C」はASCII文字コードの「\」にあたるので、perlはそれを特殊文字として処理してしまいます。この場合は「\」をカットしてしまうのです。これはperlがShift_JISコードをサポートしていないために起こるのです。

文字化けはいつ起こるのか

上記の古いperlの文字化けは、
print "表示\n";
とすると、画面に「侮ヲ」が表示されてしまうというものでした。この文字化けはどこで起こったのでしょうか。まず「"表示\n"」を含んだperlのスクリプトをエディタで作成しをShift_JISコードで保存します(ここではhyoji.plというファイル名としましょう)。この時点では文字は正しくShift_JISで保存されています。このスクリプトを実行するときは、コマンドラインから、引数にスクリプトファイルを指定して
$ perl hyoji.pl
とperlを起動します。このとき、perlインタプリタは、hyoji.plを読み込み、実行していきます。このとき「"表示\n"」という部分の中にある「5C」を「\」だと判断してカットしてしまうのです。ですから、文字化けはperlスクリプトの実行時に起こることが分かります。

perl 5.8.1 以降の文字コードサポート(文字化け対策)

5.8.1 以降は文字コードがサポートされているので、スクリプトファイルの文字コードをperlに教えてやれば、正しく文字を認識してくれます。ここでは、スクリプトをShift_JISではなく、UTF-8で保存したとします。perlには、スクリプトの最初で、
use UTF8;
と記述します。これで、スクリプトがUTF-8だとperlは認識できます。(なお、スクリプトがShift_JISのときは、「use encoding "cp932";」とします。これでも文字化けは起こらなくなります)

まとめ

1 perlスクリプトはUTF-8で保存する
2 スクリプトの最初に「use UTF8;」と記述しておく