ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

マルチバイト対応正規表現関数(mb_ereg系)でUTF-8の文字列が正しく処理できない件について

まずは、この辺()を参照してもらった上で、どうしてこうなっているのか説明をしたいと思います。
書こうと思ったキッカケはオレンジニュースで掲載されていたので。
参照して頂ければ(参照しなくても)分かると思いますが、PHP4系統ではマルチバイト対応正規表現関数(mb_ereg系)はUTF-8の文字列を正しく処理できませんが、PHP5系統では正しく処理できます。
理由は簡単で、PHP4系統とPHP5系統ではマルチバイト対応正規表現ライブラリの実装が全く異なっている為です。
PHP4系統はRubyに添付されているヤツ(regex.cやregex.h)、PHP5系統は鬼車。
PHP5ではバグ修正された、というよりはエンジンを載せ変えた、という方が正しいです。結果だけ見るとバグ修正だと思いますが。
問題はPHP4系統に添付されているヤツなのですが、かなり古いバージョンのモノみたいです。
Ruby1.6.8・1.8.5と比べてみると差分が(もの凄く)発生しています。差分を見た限りでは、特にUTF-8周りの変更が激しかったです。
この事から、Ruby1.8.5とコンパチの状態にすればPHP4系統でも解決か?と思ってコンパチ作業した時期がありました。
ただ、構造体の定義が変わっていたり、スレッド・セーフになるようmutex_lock関数を追加してたりと、最終的に出来上がったモノは(個人的には)修正とは言い難い状態でした。
UTF-8を使うケースが多くなってきたので対応はしたいけど、これを適用するのは「ありえないなぁ」と本能的に感じて、今に至るという状態です。PHP4系統は既にメンテナス・フェーズに入ってるし。
また、元となるバージョンを見つけきれなかったので(どういった変更を入れたのかが分からずに)何が正しいのか間違っているのかが判断しきれない、という事もありました。元となるバージョンを知っている人がいれば、是非とも教えて頂きたく。
とまぁ、事情はさておき、この件に関する解決策は、

  • PHP5系統にバージョンを上げる
  • PCREライブラリを利用する
  • EUC-JP等、他の文字コードに変換してから処理する
  • 頑張って正しく処理できるよう実装する(最後の手段)

このようになるのかなぁ、と思います。知っている人、大多数だと思いますが。失礼しましたっ。