MovableType エントリーの文字コードをコンバートする
MovableType で使用する文字コードは mt.cfg ファイル内で指定できますが、 これはあくまで画面に表示する際や、新しく書き込むエントリーのコードを指定できるに過ぎません。 データベース内にはエントリー時に指定していたコードで書き込まれているため データベースの内容自体をコード変換する必要があるのですが、 MovableType 自体の機能ではコード変換は提供されていません。 いくつかの方法が各サイトで紹介されていますが
- エントリーを Export し、エディタ等で文字コードを変換してから再度 Import
エントリーの Export / Import ではエントリーの ID までは引き継がれないため、 ID ベースのリンクなどを使用している場合正しいリンクでなくなる。 - MySQL に直接アクセスし文字コードを変換
独自にスクリプトを作成している方がいましたが、 DB が MySQL でない場合使用できません。
とくにデメリットのない方法として、 MT のライブラリを使用してコンバートするスクリプトが MT 開発用ブログに公開されています。
このスクリプトの場合 MT のライブラリ経由でエントリーやテンプレートの内容を取り出し、 MT 内の I18N モジュールもしくは Jcode を使用してコード変換した結果を また MT ライブラリ経由で DB に戻しているため、 DB の種類には全く依存せず使用できます。
なお、自分が実行した環境は
- サーバOS : linux
- Perl 5.8.0
- DB Type : Berkeley DB
- 文字コード : EUC -> UTF-8 -> Shift_JIS
はじめコンバート元のコード指定を「(auto)」(自動判定)にしていたところ 処理が途中から全く進みませんでしたが、 明示的にコードを指定すると全く問題ないなく変換できました。 スクリプトの内容を見てみたところ、(auto) を指定した場合は Jcode を、 明示的に指定した場合は I18N を使用しているため Jcode の呼び出しに問題があったようです。
なお、このスクリプトは
ブログデータベースの内容を一件ずつ呼び出し、しかるべき変更を加えて戻すという処理を繰り返しているため、文字コード変換を行っている部分を書き換えれば 多くの応用が考えられます。 実際自分もエントリー内の特定の箇所を一括置換する必要があったため コード変換の変わりに perl の置換処理を入れ、 うまく稼動させることが出来ました。 (上記「文字コード変換スクリプト」をベースにしているため公開はしませんが、 興味のある方は個別に当サイトにご連絡ください)。