my little forum 2.0 アップデート時の日本語文字化けを解消

my little forum 1.7 から 2.0 へのアップデートではデータベースのバックアップツールが用意されているのですが、そのまま使うと日本語が文字化けしてしまいます。
そこで、nic せんせーにご指導いただきつつ backup.php を修正して利用させていただきました。

backup.php の 33 行目あたり

$this->dump .= utf8_encode($data);

$this->dump .= // utf8_encode($data);
$data = mb_convert_encoding($data, 'utf-8', 'euc-jp');

に修正・追加。

backup.php の 247 行目あたり

$data['text'] = str_replace(utf8_decode($quote_symbol), '>', $data['text']);

$data['text'] = str_replace(
    // utf8_decode($quote_symbol)
    $quote_symbol = mb_convert_encoding($quote_symbol, 'euc-jp', 'utf-8'), '>', $data['text']
);

に修正・追加。

これで文字化けが解消され、日本語が正常に表示されるようになりました。
以下は修正完了までのいきさつメモなので、実際の修正・追加は上に書いた 2 カ所でおっけーです。

確認その 1

$result = @mysql_query("SELECT user_id, user_type, user_name, user_real_name, user_pw, user_email, hide_email, user_hp, user_place, signature, profile, logins, last_login, last_logout, user_ip, registered, new_posting_notify, new_user_notify, user_lock, pwf_code, activate_code FROM ".$table_prefix."userdata ORDER BY user_id ASC", $connid) or die(mysql_error($connid));
while($data = mysql_fetch_array($result))
    {

の後に die(var_dump($data)); を追加して実行してみる。

結果その 1

[16]=>  string(1) "0" ["new_posting_notify"]=>  string(1) "0"

日本語が含まれていない。

確認その 2

$result = @mysql_query("SELECT id,pid,tid,uniqid,time,last_answer,edited,edited_by,user_id,name,subject,category,email,hp,place,ip,text,show_signature,email_notify,marked,locked,fixed,views FROM ".$table_prefix."entries ORDER BY id ASC LIMIT ".$ul.", ".$settings['max_queries'], $connid) or die(mysql_error($connid));
while($data = mysql_fetch_array($result))
    {

の後に die(var_dump($data)); を追加して実行してみる。

結果その 2

[16]=>  string(118) "??????????????????? ???Ф??????????????ξ????????????????? ????餬????????????????????" ["text"]=>  string(118) "??????????????????? ???Ф??????????????ξ????????????????? ????餬????????????????????"

ブラウザの文字コードは自動判別で UTF-8 になっていて、日本語が文字化けしている。
ブラウザの文字コードを EUC-JP に変更すると日本語が正常に表示される。

nic せんせーによると、PHP の mb_internal_encoding が utf8 なのでそれを euc-jp にしてから実行したら解消されるんじゃないか、とのこと。

確認その 3

backup.php の一番最初に以下を追加。

mb_internal_encoding('euc-jp');

結果その 3

文字化け解消せず。

この作業の意味は mysql の中にある文字コードと mysql がデータを吐き出すときに解釈する文字コードが同じかどうかと言う確認と、mysql から吐き出される文字コードと php の内部で扱うデータの文字コードが同じかどうかを確認する作業、だそうです。

mysql からでたデータを直接表示してブラウザの文字コードを変える事で文字化けが解消されるのはブラウザの文字コード= PHP の内部文字コードが mysql が吐き出したデータの文字コードと一致していないから、ともおっしゃっていた nic せんせー。

そして完成へ

冒頭に記載した修正・追加の一つ目を nic せんせーに教えてもらって中途半端に文字化けが解消されました。一部日本語なんだけど半分くらいは文字化けが残っている状態。

utf8_encode を mb_convert_encoding に変えたんだから utf8_decode も変えたらいいんじゃないかと思いついてやってみたのが修正・追加の二つ目。
野生の勘が大当たりで文字化けが解消されたのでしたヽ(・ω・)ノ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です