2006年12月10日
内部コードがEUC-JPのレンタルサーバにて、WordPressをUTF-8で扱いたい場合の対処方法をいろいろなサイトや掲示板を参考にして自分なりに直してみました。
どうしてもGoogle MapsやAmazonを使ってみたかったので...
※2006.12.12 この方法は一時的なものなので、このあとの記事を参考にしてください。
【技術メモ】WordPressをUTF-8でインストールする(完結編)http://blog.belive.jp/archives/50862109.html
原因は内部文字コードがEUC-JPであること。
私のサイトはCPIでPHPは標準で4.4.1です。
MySQLは4.0と5.0が使えるます。
ただMySQLの4.xだとphpMyAdminからclient_charsetにはUTF-8を指定できませんでした。
MySQL5.0だとUTF-8を指定できるのですが、WordPress自体エラーを頻発します。
そのため、MySQL4.xで続けることにしました。
なお、WordPressはMEの2.0.5です。
PHPの設定オプションを変更するには、.htaccessにphp_valueなどを書き込む方法があります。
しかしCPIでは、.htaccessにphp_valueなどを入れるとエラーになるので、wp_config.phpに同じような条件を入れることにしました。
いろいろと試したところ、次のようにしたらうまくいきました。
まずはWordPressそのものは、インストール時に「UTF-8」でインストールします。
(すでにEUC-JPで作成されている方は、必ずDBのバックアップをとってください。一度消したのちの再インストールです。)
でないとユーザの権限などが化けます。
MySQLのテーブルを調べてみると、MySQLの内部コードがEUC-JPでもUTF-8で無理矢理登録してやれば上手くゆくようです。
そのため、インストール時に「UTF-8」にする必要がありました。
一旦、インストールしたらwp-config.phpを編集します。
【オリジナル】
mb_language("Japanese");
mb_internal_encoding("UTF-8");
【編集後】
ini_set("output_buffering","on"); //2006.12.09 add
ini_set("mbstring.encoding_translation","off"); //2006.12.09 add
ini_set("output_handler","mb_output_handler"); //2006.12.09 add
ini_set("default_charset","UTF-8"); //2006.12.09 add
mb_language("Japanese");
mb_internal_encoding("EUC-JP");
ini_set("mbstring.http_output","UTF-8"); //2006.12.09 add
ini_set("mbstring.http_input","auto"); //2006.12.09 add
ini_set("mbstring.substitute_character","none"); //2006.12.09 add
これは.htaccessに同じように書いても同様であると思います。
では、問題は何か?
どうやら、POSTされた変数が内部コードのEUC-JPになっていて、MySQLに書き込まれる際にEUC-JPで書き込まれることです。
書き込まれたデータが、UTF-8で取り出されれば良いのですが、取り出すときもEUC-JPのままです。
そこで、どうすれば可能になるか...ヒントは「ユーザの権限」のリストにありました。
MySQLにUTF-8のまま、無理矢理でも書き込めばいい。
そのためには、POSTされたデータをEUC-JPからUTF-8に直せばいい。
しかし、POSTされたデータをひとつずつ変換するのは大変。
ならば、SQL文を発行する際にUTF-8に変換すればOKでは無いか?
wp-includes/wp-db.phpに手を加えてみました。
133行目の
function query($query) {
// initialise return
$return_val = 0;
$this->flush();
のあとに
// Char-Set of the Query was Changed. 2006.12.09 add
if (function_exists ("mb_detect_encoding")
&& function_exists("mb_convert_encoding")) {
switch (mb_detect_encoding($query, "auto")) {
case "UTF-8":
break;
default :
$query = mb_convert_encoding($query, "UTF-8");
break;
}
}
本当はこのままではUTF-8限定になってしまいます。が、とりあえず...
これで試してみました。
OKです。 ...のはずでしたが、データベースを使わないところではダメですね。
たとえば、ファイルの編集機能のところとか...
もう少し調査してみなければ...