RedHat ES4、Movable Type3.3の環境で運用を開始しようとしたら、一部が文字化けすると言う現象が発生しました。
調べてみると色々複合的な問題だったのですが・・・
1. DB(Postgres7.3)の文字コードがSQL_ASCIIだった(※)
2. Movable Typeで埋め込んだテンプレートのcharsetをShift_JISに設定していた
3. Movable Typeのテンプレートから参照している外部のJavaScriptファイルがShift_JISで書かれていた
※ DBを確認すると確かにSQL_ASCIIと出るのですが、データ自体はどうもUTF-8で取り扱われているようでした・・・。
そもそもSQL_ASCIIだと日本語が扱えないはずなのにデータ投入できるし。。。
RedHatES4のパッケージ(RPM)からインストールされてるものだったので、詳細がよく分からず。
DB初期化時に/etc/sysconfig/i18nファイルの文字コードを反映させるようにしているのかな・・・?
まず、PostgresではShift_JISは取り扱えないので、Movable Type全体の文字コードをUTF-8で運用しようと考えました。
ただ、3.の外部のJavaScriptファイルが他のシステムでも使っていて、その文字コードをUTF-8にする事ができませんでした。
そもそも、UTF-8⇔Shift_JISの変換に対してMovable Typeが上手く対応してくれません。
※ 前述したとおり、DBはSQL_ASCIIとなっていたので、本当にUTF-8だったのか怪しいものなんですがmt-config.cgi
ファイル内に、「PublishCharset utf-8」を指定してやるとデータ自体は文字化けしませんでしたので。
次に考えたのが、DBをEUC_JPにしてみようという案。
テストしたところ、EUC-JP(DB)⇔Shift_JIS(Movable Type)は問題ない模様。
まず、Movable Type側の文字コードをShift_JISに変更します。
1. mt-config.cgiをエディタで開き、以下の一行を加える(又は編集)します。
PublishCharset Shift_JIS
次に、DBの文字コードをSQL_ASCIIからEUC_JPに変更します。
これには、一度DBを削除し再作成するしかありません。
実行する前に必ずバックアップを取るようにします。
2. DBの現状をバックアップする
$ pg_dump hoge-db > backup.dmp
3. DBを削除します
$ dropdb hoge-db
4. DBをEUC_JPで再作成します。
$ createdb -E EUC_JP hoge-db
後は、データを再投入すれば一丁あがりなんですが、ここでまた問題が発生しUTF-8で取り扱ってたデータをEUC_JPのDBに投入できません・・・。
(スキーマは移行できるが、データが入らない)
考えた苦肉の策が、pg_dumpしたファイル(bacup.dmp)をiconvコマンドを使って無理やり文字コードを変更してみると言う作戦。
5. iconvを使ってダンプファイルのコードを変換
$ iconv -f UTF-8 -t EUC_JP backup.dmp > backup_euc.dmp
6. 再作成したDBにデータの投入
$ psql -e hoge-db < backup_euc.dmp
確認してみると、データも無事に投入されています。
※ iconvの-fオプションにUTF-8を指定して問題なかったということは、やっぱりDBの中身はUTF-8だったということでは・・・?
DBのエンコーディングは確かにSQL_ASCIIと表示されるのに。
でも、UTF-8のDBを作成するとUNICODEと表示されるはず・・・。
Movable Typeはテンプレートやエントリーは全てDBに保存されているので、全てのデータが移行されているはずです。
ただ、最後にサイトの再構築が必要です。
これは、Movable Typeの管理メニューの「サイトを再構築」から行えます。
関連記事
Movable TypeでオリジナルBlogを作る 【環境設定編】
Movable TypeでオリジナルBlogを作る 【導入編】
Movable Typeで作成したBlogをOpenIDに対応させる
Movable Typeのログインが遅い件の対応 + Apache2、mod_perl2導入