TOP > スクリプト制作メモ > HTML, CGIでの文字コード指定について

≫文字コードは明示的に指定する

HTMLでウェブページを作成する場合、明示的に文字コードを指定する必要があります。なぜなら、文字コードは複数存在し、ブラウザの自動判別や設定に頼ると文字化けが発生する可能性が高くなるからです。

文字コードは、本来ならHTTPヘッダで指定されるべきものですが、日本のHTTPサーバの多くは Content-type のみを送信して文字コードは明示しないことが多いようです。これは、サーバのユーザによっていくつかの文字コードが使用されるため、その指定をHTMLファイルのレベルで行うための配慮かもしれません。

CGI 等の場合、HTTPヘッダを吐き出すことができるので、そこで文字コードを指定することができますが、HTMLを出力する場合は念のためHTMLレベルでの文字コード指定も行った方が良いかもしれません。なぜなら、HTTPヘッダで指定された文字コードに必ず従うクライアントもあれば、HTMLで指定されればそちらに従うクライアントも有り得るためです。HTTPヘッダを無視する場合にHTMLで指定されていなければクライアントの判断に依存することになり文字化けの可能性が高くなります。

≫HTMLファイルでの明示方法

ブラウザは、設定にも依りますが自動認識よりも明示された言語や文字コードを優先して処理します(そういう前提が無ければ明示する意味が無いので当然と言えば当然ですが)。

以下の内容は、HTMLが書かれている言語や文字コードを明示するもので、当たり前の話ですが、Shift_JIS で記述しているのに EUC であると明示した場合、文字化けの原因となります。せっかくなら正しく行いましょう。
  • <html lang="ja">
    まず、<html>の中で使用言語を示します。ja は日本語を示します。日本語以外では en (英語)、fr (フランス語)、de (ドイツ語)、zh (中国語) などがあります。参考:ISO639 言語コード
     
  • <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
    METAタグのContent-typeを明示すると同時に文字コードも明示します。Shift_JIS 以外は EUC-JP, iso-2022-jp (JIS), UTF-8(Unicode) などがあります。
    Shift_JIS はアンダーバー。EUC-JP と iso-2022-jp, UTF-8はハイフンです。
    × content="text/html;" charset="Shift_JIS"
    ○ content="text/html; charset=Shift_JIS"
    記述方法で間違われることが多いので注意しましょう。content=" " の中に charaset=XXX があります。

≫CGIでの明示方法

CGIは出力するものによって様々ですが、ここではHTTPヘッダでの明示方法です。
  • print "Content-type: text/html;charset=Shift_JIS\n\n";
    HTTPヘッダで文字コードを指定します。Shift_JIS 以外は EUC-JP, iso-2022-jp (JIS), UTF-8(Unicode) などがあります。
    ここでは、Perl で HTML を出力することを前提としています。なので、スクリプトが EUC で記述されていても Shift_JIS を出力する場合は、Shift_JIS を指定します(そういうややこしいことはあまりしないとは思いますが)。
明示方法ではありませんが、よく使うと思われるので、jcode.pl での文字コード変換を。
  • &jcode::convert(\$string,'sjis');
    $string を Shift_JIS に変換します。基本的に $string の文字コードが不明な場合に使用します。変換できる文字コードは sjis, euc, jis の3種類があります。Unicodeには対応できません。元の $string が3種類以外の場合も変換できません。文字コードを指定する文字列が Shift_JIS や EUC-JP などではないことに注意しましょう。
    Perl4 での記述は &jcode'convert(*string,'sjis'); です。
     
  • &jcode::euc2sjis(\$string);
    文字コード EUC の $string を Shift_JIS に変換します。
    &jcode::変換元文字コード2変換文字コード(\$hoge);
    という書式で変換します。
    元の文字コードがわかっている場合は、この方法の方が先の convert より処理効率が良くなります。指定できる文字コードは sjis, euc, jis の3種類です。Unicodeには対応できません。文字コードを指定する文字列が Shift_JIS や EUC-JP などではないことに注意しましょう。
    Perl4 での記述は &jcode'euc2sjis(*string); です。
Jcode.pm を使用する場合は以下の様な記述になります(jcode.pl との比較的な解説)。
  • use Jcode;
    モジュールの読み込みは require でなく use を用います。
     
  • &Jcode::convert(\$string,'sjis');
    "&jcode::" → "&Jcode::" 呼び出しの文法は jcode.pl と同じですが、頭の j を大文字の J にします(たったのこれだけ)。
     
    Jcode.pm は Unicode に対応しているので、UTF8 を使用している google 等の検索キーワードも綺麗に変換することができます。MIME headerもサポートされているので、メール送信時に Subject に容易に日本語を書けます。ただし、変換処理に関して多少 jcode.pl より重いらしいです。





jcode.pl と Jcode.pm を自動判別する。



jcode.pl はライブラリなので、ディレクトリに置いて require するだけで利用できますが、Jcode.pm はモジュールなのでサーバの一般ユーザが簡単にインストールすることができません。

また、汎用的なCGIを作成する場合においては、Jcode.pm がインストールされていれば Jcode.pm を優先的に使用して、なければ jcode.pl を使用するというようなことができると便利です。

というわけで、以下のコードをご利用頂くと、Jcode.pm があれば Jcode.pm を利用し、無ければ jcode.pl を使用します。

■ライブラリの自動判別読み込み処理
eval 'use Jcode;';
if($@){
require 'jcode.pl';
$jcnv = 'jcode::convert';
}else{
$jcnv = 'Jcode::convert';
}


■変換処理
&$jcnv(\$trans_str,'euc');


文字コード変換以外の機能を使う場合は、それ用に変数を用意しないといけませんが、基本的にこのやり方でうまくいくと思います。

≫Apache の httpd.conf での文字コード指定

プロバイダのサーバスペースを使用している人にはほとんど関係ありませんが、自宅サーバや専用サーバをレンタルしていると、ウェブサーバの設定をいじらなければならない必要があると思います。

ここではウェブサーバとして代表的な Apache での設定を紹介します。

Apache では httpd.conf というファイルで設定します。

私の場合、/etc/httpd/conf/httpd.conf にありましたが、大抵は /usr/local/apache/conf/httpd.conf とか /etc/httpd/conf/httpd.conf なんかにあると思います。
どこにあるかわからなければコンソールで find / httpd.conf です。
  • AddLanguage
    AddLanguage en .en
    とか
    AddLanguage da .dk
    という記述がずらっと並んだところで、
    AddLanguage ja .ja
    を先頭行に持ってきます(なければ追加)。
     
  • LanguagePriority
    LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
    という行で ja を先頭に持ってきます(なければ追加)。
     
  • AddDefaultCharset
    AddDefaultCharset off
    または、
    AddDefaultCharset shift_jis
    と設定します(または AddDefaultCharset EUC-JP など)。
     
  • AddCharset
    AddCharset shift_jis .sjis
    AddCharset EUC-JP .euc-jp
    という2行を先頭行にします(なければ追加。ただ、ここは先頭行でなくてもいいと思いますが)。
     
RedHat8.0 リリース時期にブロードバンドの普及があって、自宅サーバを組んだ方も多いと思いますが、RH8.0 の Apache が 2系統な上、日本語設定がデフォルトではないのはちょっとおしいですね。私も最初は戸惑いましたが、上の設定でなんとかなりました。参考にどうぞ。

参照:文字コードと改行コードについてもご覧願います。

TOP > スクリプト制作メモ > HTML, CGIでの文字コード指定について
(C) bayashi.net