FreeBSDのメンテをしていたら、いつのまにかrubyが1.9から2.0になったり、perlが5.16から5.18になったり、共有ライブラリの*.laファイルを使わない方針になったりといろいろ変わっている。
/usr/ports/UPDATINGを見ながら、それぞれアップデートする。
rubyのバージョンが上がったので、passengerを入れ直したり、bundle installしたりして、なんとなく動いたかな〜、と思っていたら、MovableTypeで文字化けが発生。
状況としては、以下のような感じ。
  1. 管理コンソールは普通に表示できる。
  2. 新しい記事を書いて公開しようとすると、テンプレート「ヘッダー」がないよ的なエラーが出た上に保存した記事が文字化けしている。
  3. DBを覗くと、DBに入っている時点で文字化けしている。
化け方としては、「あ」と入れたものが、psqlで表示すると「ã\u0081\u0082」のようになる。「あ」のUTF-8でのurlencodeが「%E3%81%82」であることから、おそらく「\u00e3\u0081\u0082」のように化けているものと思われる。
*.laファイル削除の関係で、文字コード変換系のライブラリが読めてないのかな?と思ってperlとperlのモジュールを全て再インストールしてみたけど変化無し。
もともと、非推奨のPostgreSQLを使っているので、サポート的な物は期待できないし、検索しても似たような例は見当たらない。
そこで、現象の切り分けと推測を始める。
まず、管理コンソールが普通に表示できて、過去に保存した記事が読めることから、DB→cgi→ブラウザでの表示は問題ないことがわかる。
そして、新しく入力した記事が文字化けすること、存在するはずのテンプレート「ヘッダー」が見つからないと言われることから、cgi→DBで文字化けが発生していると考えられる。
後は、ソースからDBとの入出力をしている箇所が特定できれば良いのだが、MovableTypeは自前のOR Mapperを使っているらしく、なかなか該当の箇所が探せない。
諦めかけて、MySQLに移行しようかと思ったりもしたけど、MySQLはあまり好きではない。さらに、SQLレベルでの移行ではなく管理コンソールを使ってのexport/importらしく、試しにexportしてみようとしたが、途中で接続が切れてしまった。
もう少し現象を理解しようと思って、自分でperlのプログラムを書いて検証したところ、DBIモジュールでDBと出し入れするときは、utf8::is_utf8()がtrueを返す文字列(つまり、utf8のperl内部表現の文字列)を使うことになっているが、生のutf-8の文字列を渡すと同じように文字化けすることがわかった。
この辺については、Perl: 文字コードとutf8フラグについて - @bayashi Wikiとか、404 Blog Not Found:perl - utf8::is_utf8("\x{ff}") == 0あたりが詳しい。
とにかく、文字化けしているデータをEncode::decode_utf8(xxx)すると文字化けが治ることがわかったので、後はソースから余計にEncode::encode_utf8(xxx) もしくはEncode::encode('utf8', xxx)している箇所を探せば良い。
のだが、私の力ではMovableTypeのソースが読みこなせなかったので、次はDBに入れるところ(SQLのパラメータをDBIに渡しているところ)が探せれば良いのだが、前述の通りOR Mapper(ObjectDriverと言う名前らしい)を使っているのと、DBIとかPgとか同じ名前のクラスが複数パッケージに存在していて、効きそうな場所が見つけられない。
諦めかけたところで、lib/MT/Object.pm に辿り着く。こいつがOR MapperのObjectのスーパークラスのようで、__core_final_pre_save とか、 __core_final_pre_search とか言うトリガを登録しているところで、Encode::encode()している箇所が怪しそうだと当たりをつける。
そこで、encodeしているところをコメントアウトしてみたところ、無事に文字化けが発生しなくなった。
しかし、この対応が正しいとは思えないので、どなたか正しい原因と対策を教えてください〜。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: MovableTypeとPostgresqlでの文字化け

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/3201

コメントする

このブログ記事について

このページは、falseが2014年12月27日 13:21に書いたブログ記事です。

ひとつ前のブログ記事は「fm3マイコンで遊ぶ(4)」です。

次のブログ記事は「git の基本」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1