phpBB、機能はすばらしいんですけど…。←コレばっか(–;;

また日本語コードが混じった文字列の置換部分で不具合を発見してしまいました。

$code_entities_match = array('#<#', '#>#', '#"#', '#:#', '#\[#', '#\]#', '#\(#', '#\)#', '#\{#', '#\}#');
$code_entities_replace = array('<', '>', '"', ':', '[', ']', '(', ')', '{', '}');
$between_tags = preg_replace($code_entities_match, $code_entities_replace, $between_tags);

こいつはBBCodeの[code]タグを表示する際に実行されるコードなんですが、これでは “ー” や “―” や “‐” などの文字が文字化けしてしまいます。なぜかというと、これらの棒線文字ってのは、2バイト目に”]”とか”)”を含んでいるからです。preg_replace関数は1バイト目にマルチバイト判別文字がきても、対処してくれないんですよね。

おいらはPerlの文法がまだよくわかっていないんで、新たに置換ルーチンを作るのはちょっとしんどいです。ということで、置換前に一時的にSHIFT-JISからEUC-JPに文字コードを変換してみることにしました。このEUC-JPってのは、マルチバイト文字がアスキーコードの主要文字コードと重ならないため、間違った置換を防ぐことができます。

で、こんな感じになりました。mb_convert_encoding関数バンザイです。

//置換用の文字を設定
$code_entities_match = array('#<#', '#>#', '#"#', '#:#', '#\[#', '#\]#', '#\(#', '#\)#', '#\{#', '#\}#');
$code_entities_replace = array('<', '>', '"', ':', '[', ']', '(', ')', '{', '}');

//マルチバイト文字と重ならないように、EUC-JPに一時的に変換
$between_tags=mb_convert_encoding($between_tags,"EUC-JP","SJIS");

//置換
$between_tags = preg_replace($code_entities_match, $code_entities_replace, $between_tags);

//SJISに戻す
$between_tags=mb_convert_encoding($between_tags,"SJIS","EUC-JP");

不具合対処のためだけに文字コードを変換してしまうという邪道な手を使いましたが、なんとかこの問題は回避できました。なんか、ここ数日は毎日こんなことをやってます。phpBB日本語版、ちゃんとしてくれよ〜