tips/web/MovableType/エントリーの文字コードをコンバートする

2008-03-13 (木) 12:27:22 (4284d)

エントリーの文字コードをコンバートする

MovableType で使用する文字コードは mt.cfg ファイル内で指定できますが、 これはあくまで画面に表示する際や、 新しく書き込むエントリーのコードを指定できるに過ぎません。 データベース内にはエントリー時に指定していたコードで書き込まれているためデータベースの内容自体をコード変換する必要があるのですが、 MovableType 自体の機能ではコード変換は提供されていません。 いくつかの方法が各サイトで紹介されていますが

  • エントリーを Export し、エディタ等で文字コードを変換してから再度 Import
    エントリーの Export / Import ではエントリーの ID までは引き継がれないため、 ID ベースのリンクなどを使用している場合正しいリンクでなくなる。
  • MySQL に直接アクセスし文字コードを変換
    独自にスクリプトを作成している方がいましたが、 DB が MySQL でない場合使用できません。

とくにデメリットのない方法として、 MT のライブラリを使用してコンバートするスクリプトが MT 開発用ブログに公開されています。

Movable Type の文字コード変換スクリプト

このスクリプトの場合 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 の置換処理を入れ、 うまく稼動させることが出来ました。 (上記「文字コード変換スクリプト」をベースにしているため公開はしませんが、 興味のある方は個別に当サイトにご連絡ください)。