[simple-way:~] CTO% cat 2007年08月29日04:47.txt
文字コードの問題は解決するのにとても時間がかかります。
今日も文字コードに悩まされてこんな時間になってしまいました・・・。これ書いたらねます・・・。
たぶんウェブプログラムを作る時はデータベースもソースコードもUTF-8で書くのが安全だと思います。いくらかの文字の変換に問題が起こるようですが、多少の犠牲はあるにせよUTF-8が一番問題の起きにくい文字コードであると思っています。
しかし、世の中にはそれを阻むサーバーもあるわけで。レンタルサーバーを使っているとデータベースや言語エンジンの設定は変更できないため、どうしても提供された環境の文字コードを使わざるを得なくなります。
それでも何とかUTF-8を活用しつつ、文字コードの問題を抑えたい。
そこで、今まで文字コードの問題にぶつかり、そのたびに学んできたことをここにまとめておこうと思います。対象とする環境はPHP4.3以上、MySQL4.1以上です。おそらく以下の手法はPHP5およびMySQL5でも有効だと思います。
・ソースコードとHTMLの文字コード
まずソースコードとHTMLの文字コードを統一しておかなければ意味がありません。もちろんUTF-8を使うわけですが、このときBOMヘッダをつけてはいけません。多くのプログラムではBOMの有無にかかわらず動作・表示してくれますが、古いプログラムではBOM付のデータは無効なものとして扱われる可能性があります。
・作成するテーブル
CREATE TABLE 時に DEFAULT CHARACTER SET を設定します。デフォルトの文字コードを指定することで挿入されるデータがUTF-8になります。具体的には以下のようにクエリを実行します。
CREATE TABLE hoge (
hoge_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
hoge_name TEXT
) DEFAULT CHARACTER SET utf8;
・データベース接続時
データベース接続直後に SET NAMES クエリを実行します。そうすることでその後のすべてのクエリ(同じ接続が維持されている限り)はUTF-8で送信されることをMySQLに教えることができます。具体的には以下のようにクエリを実行します。
mysql_connect('host', 'user', 'pass');
mysql_query('SET NAMES utf8');
ちなみに本当はSET NAMESをプログラムから実行してはいけないようです(参考)。PHP5.1以上にはmysqli_set_charsetが用意されているので、この関数を呼び出すのが好ましいでしょう。(しかしながら、バージョン互換のプログラムを書くときには今のところは使えないですね・・・)
・PHPの文字コードに関する設定
ソースコードをUTF-8で書いているので、それをPHPに教えてあげた方が問題が起きにくくなります。PHPの設定はphp.iniで行うのが一般的ですが、htaccessを使っても設定を変更することができます(php.iniで許可されている場合)。具体的には以下のようなディレクティブを設定します。
php_value mbstring.script_encoding UTF-8
とりあえず今のところやっている対策はこれくらいでしょうかね。さぁ寝よう・・・。
[simple-way:~] CTO% []