無料家計簿ではレンタルサーバを使用する都合上、データベースのメンテナンスはphpMyAdminで行う事となる。
ローカルで開発・設定したデータをテキストファイル(またはテキストを圧縮したファイル)にしてアップロードを行う。
しかし、出来あがったテキストを見てみると、みごとに文字化けをしている。
ググってみると、かなりの人が同様の現象で悩んであきらめていた。
しかし、なんとか対応出来たので、その方法を公開しよう。
原因を調べる
漢字変換は mb_convert_encoding() で行っていると推測して、すべてのスクリプトで mb_convert_encoding を検索してみた。
実際に使っているのはこのスクリプト。
phpMyAdmin/libraries/kanji-encoding.lib.php
この中の PMA_kanji_str_conv() で使っている。
$dist = mb_convert_encoding($str, $enc, $nw);
ここで $nw は変換元の文字コードで、
$nw = mb_detect_encoding($str, $enc_list);
で取得している。
$enc_list はグローバル変数で、文字コードの検出順を指定している。
ははーん。どうやら文字コードの検出順がおかしいんだな。
対策する
グローバル変数 $enc_list を設定しているのは、同じこのスクリプト。
phpMyAdmin/libraries/kanji-encoding.lib.php
この中の以下の関数で設定している。
PMA_internal_enc_check()
PMA_change_enc_order()
更新日付は 2003/11/26。このころはまだ UTF-8 は今ほど普及していなかった。修正個所では、検出順に含まれてすらいなかった。
あきらは以下のように修正して対応できた。各自の環境に合わせて調整する必要があるかもしれない。
// $enc_list = 'ASCII,SJIS,EUC-JP,JIS'; $enc_list = 'UTF-8,EUC-JP,SJIS,JIS,ASCII';
根本対策
レンタルサーバの事業者の方、どうか上記対策を行ってください。
いまどき、ブログもMySQLを使うんですよ。
レンタルサーバで困っている方は、管理者を説得して上記対策をしてもらおう。
phpMyAdmin のHTMLは UTF-8 で書き出されているので、内部的に全て UTF-8 に統一すべきだろう。
読み出したデータは全て UTF-8 に変換する。
また、書き出すデータは全て UTF-8 から変換する。
手間かもしれないが、あたりまえの事だ。
文字コードの自動判別をやめて、上記 $nw を ‘UTF-8’ 固定にすべきだ。
phpMyAdminエクスポート時の文字化けを解消
phpMyAdminでUTF-8のデータをSJISでエクスポートしようとしたとこ…
とても助かりました!
ありがとうございます。
私の場合は、吐き出したEUCが部分的に文字化けする症状でした。
結構古い記事ですが、ご丁寧にお礼を頂き、こちらこそありがとうございます。