AsiajinのWordPressを3.0にしたら日本語が化けるようになったので対処した

あまり類似例は無いかもしれないけど、いちおうメモ。

前提として、海外のホスティングで古いバージョンのWordPressから使っていたというのがあります。しかも、そのWordPressはホスティングサービス(Dreamhost)が用意したワンクリックインストーラーでセットアップしたものでした。つまり、WordPressの細かい設定はおまかせで立ち上げたものです。

# 英語のブログだから、おまかせでいいだろう、と判断したような記憶がうっすらと。手抜きはいかんですね。

今回WordPress3.0に上げたら、以前の記事中の日本語が化けて表示されるようになり、また編集フォームで日本語を書いたらそれもすぐ化けるようになりました。

原因は、MySQLデータベースの中のテーブルの文字エンコーディングとコレーションが、’latin1′, ‘latin1_swedish_ci’になっていたことです。これでは、データベースとやりとりする時のテキストが、西ヨーロッパ言語のアルファベットとして保存されてしまいます。

しかし、WordPress2.9.xまでは日本語も問題なく動いていました。それはなぜかというと、書き込んだ日本語をlatin1だと思い込んで格納し、ブログ記事を表示するときもlatin1のつもりで元と同じデータを表示していたため、偶然元の日本語に戻っていたからです。

WordPress3.0でどうして化けるようになったのかは追ってないですが、たぶん、エンコーディングの指定がない時にはUTF-8でDBと接続するようにされたんじゃないかと思います。その結果、latin1で入っていた日本語をUTF-8で取り出そうとして、不要な変換がかかってしまい、化けるようになった。

で、修正ですが、データを全部取り出して、テーブルのエンコーディング指定を変更し、再度そのデータを入れなおす、という方法をとりました。

まずはWordPressのバックアップを。念のためにバックアップしたファイルは別のマシンへ退避させます。ブログへのアクセスを止めるため、メンテナンスモードにします。Apacheの設定で別ページを表示するとか、メンテナンスを表示するpluginを使うとか、このへんはいろいろ。

ホスティングのサーバにログインして、データをlatin1だと思い込ませてダンプを行います。

$ mysqldump –host=(mysqlサーバ) -u user -p db_name –default-character-set=latin1 > db_name.latin1.txt

保存されたファイルを開いて、日本語部分が日本語として出ていることを確認します。ここでも化けていたら、最初の仮説(latin1として日本語を格納している)は間違っていたことになります。

ダンプされたSQLの中のテーブル定義に、たくさん’latin1’が入っていると思います。これを’utf8’に置換します。これをたとえば db_name.utf8.txt として保存

そうしたら、このファイルでもってデータベースを上書きします(mysqldumpでダンプしたSQLは、create前に今あるテーブルをdropしているので)

$ mysql –host=(mysqlサーバ) -u user -p < db_name.utf8.db これで、メンテナンスモードを解除し、日本語を含んだページを表示させてみて、文字化けしていなければ完了です。ここでも念のためにバックアップを取りました(変換直後の状態に戻す必要が出るときのため)

コメントを残す

メールアドレスが公開されることはありません。