BBClone 0.4.9bの文字化けを直す

BBCLONE X JAPANESE - BBClone 0.4.9bの文字化けを直す

年末に0.4.9b-utf8が出たばかりの、見た目重視型PHPアクセス解析スクリプト「BBClone」。日本語対応で、解析画面の各文言もローカライズが行われているが、実はあまり日本語は得意ではなく、ページ名、検索キーワードが文字化けしたり、全角スペースの検索キーワードの区切りを区切りと認識せずに、繋がった一つのキーワードと認識してしまうので、非常にスマートではない。

しかし世の中には、そのBBCloneの不具合を直している凄い人がたくさんいる。その方々のお力をお借りし、独自スパイスを交え、BBCloneを正常に日本語を解析できる手術を行った。なお、今回の修正は文字コードがUTF-8のサイトに設置している場合のみ。バージョンはBBClone0.4.9b-utf8で行った。

日本語の文字化けを修正した素晴らしき方々

今回参考にさせていただいたサイトは、下記の2サイト。こんなに複雑に入り組んだBBCloneを解析して修正してしまう凄い人達です。感謝!!

なお、各サイトにはv0.4.9b以前のバージョンでの修正となっているが、十分0.4.9bでも効力を発揮する。それでは早速修正部分を明記していくが、その前に以下のファイルをバックアップしておくこと。複雑に入り組んだスクリプトをいじるのだから、これぐらいは保険をかけておこう。

  • bbclone/log_processor.php
  • bbclone/constants.php
  • bbclone/charconv.php
  • bbclone/lib/referrer.php
  • bbclone/var/

ページ名文字化け修正

ページ名に特定の感じが入っていると文字化けしてしまう対策をまず行う。

bbclone/constant.php 60行目。

$BBC_SEP = chr(173);
↓
$BBC_SEP = ">>>>>>>>>>";

検索キーワード関連の修正

検索キーワードがうまく取得できなかったり、全角スペースでの区切りの不具合の解消。

bbclone/lib/referrer.php 40行目

$pool[$i] = preg_replace("%^W*(b.{2,}b)W*$%", "\1", $pool[$i]);
↓
$pool[$i] = (defined("_BBC_MBSTRING")) ?
mb_ereg_replace("%^¥W*(¥b.{2,}¥b)¥W*$%", "¥¥1", $pool[$i]) :
preg_replace("%^¥W*(¥b.{2,}¥b)¥W*$%", "¥¥1", $pool[$i]);

bbclone/lib/referrer.php 124〜126行目

$raw_search = (($from !== false) || defined("_BBC_RECODE")) ? bbc_convert_lang($raw_search, $from, $char) :
$raw_search;
$raw_search = bbc_get_sep($raw_search, $word_sep);
↓
$raw_search = (($from !== false) || defined("_BBC_RECODE")) ? bbc_convert_lang($raw_search, $from, $char) :
$raw_search;
$raw_search = defined("_BBC_MBSTRING") ?
mb_convert_kana($raw_search,"aKV") : $raw_seach;
$raw_search = defined("_BBC_MBSTRING") ?
mb_ereg_replace(' ','+',$raw_search) : $raw_seach;
$raw_search = bbc_get_sep($raw_search, $word_sep);

bbclone/lib/referrer.php 131行目

$tmp = !$char ? strtolower(bbc_clean($raw_search[$i])) : bbc_clean($raw_search[$i]);
↓
bbc_clean($raw_search[$i]);
$tmp = defined("_BBC_MBSTRING") ? mb_strtolower(bbc_clean($raw_search[$i])) :
strtolower(bbc_clean($raw_search[$i]));

検索キーワードにUTF-8とEUCの混在環境での文字化け修正

上記のコード修正で、大部分の文字化けが修正されるが、十分ではない。下記のコード修正でさらなる改善を行う。

bbclone/log_processor.php 112行目

if (defined("_BBC_MBSTRING") && (stristr("UTF", $char) || stristr("EUC-JP", $char) || stristr("gb2312", $char))) {
↓
if (defined("_BBC_MBSTRING") && (stristr("UTF", $char) || stristr("UTF-8", $char) || stristr("gb2312", $char))) {

bbclone/charconv.php 28行目

return mb_detect_encoding($str, "JIS, UTF-8, EUC-JP, SJIS");
↓
return mb_detect_encoding($str, "UTF-8, JIS, EUC-JP, SJIS");

bbclone/charconv.php 41行目

(!empty($BBC_CUSTOM_CHARSET) && stristr("UTF", $BBC_CUSTOM_CHARSET))) {
↓
(!empty($BBC_CUSTOM_CHARSET) && stristr("UTF-8", $BBC_CUSTOM_CHARSET))) {

bbclone/charconv.php 86行目

return bbc_convert_keys($str, $from, "EUC-JP");
↓
return bbc_convert_keys($str, $from, "UTF-8");

完璧ではないが、向上した日本語解析

上記のコード修正で、自分の環境では日本語解析能力が大幅に上昇した。特に検索キーワードは今まで全角スペースで区切られていなかったので、あまり宛にならなかったが、それは今では大変心強いキーワード解析を行ってくれている。しかしながら、どうも検索キーワードを全部拾ってきてくれていない気がする。詳細統計を見ていても、検索キーワードが表示されていないのに、なぜかリファラーがGoogleやYahooになっている。しかも、そのページに移動してみると、きちんとキーワードを入力して検索しているのだ。このような例が極くたまに起きていて、その辺修正できないかと現在情報収集中。解決方法がわかり次第、ご報告いたします。

related story