Movable Type文字化けの対応 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

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の管理メニューの「サイトを再構築」から行えます。