mb_regex_encoding()でJISが指定できない

少し前に「マルチバイト対応の文字列折り返し処理」というエントリを書いたけど、その中でpreg_split()だとうまくいくのにmb_split()だとうまくいかない処理というのがあった。
で、今日たまたま似たような処理を書いていたんだけど、何故かmb_split()でもうまくいったのでなんでだろうと思ったら、要するに文字コードの設定が適切ではなかったということだった。


mb_split()は第一引数が正規表現パターンになっていて、内部では鬼車で正規表現処理を行っているのでmb_internal_encoding()ではなくてmb_regex_encoding()で文字エンコーディングを設定してやらないといけなかったらしい。
というわけで早速mb_regex_encoding()でエンコーディングも設定するようなコードに書き直して万々歳……と思ったらそうもいかなかった。JIS(ISO-2022-JP)を指定したら'Unknown encoding'とかいって怒られた。

mb_internal_encoding('JIS');   // OK!
mb_regex_encoding('JIS');      // NG

mb_internal_encoding()では使えるのに、mb_regex_encoding()では使えないとは??

mbstringモジュールの実体

そもそもなんでmb_internal_encoding()とmb_regex_encoding()に分かれているのかというと、大半のmb系関数はlibmbflというライブラリを利用した実装で、mb_regex系関数は鬼車を利用した実装というように内部が分かれているからだったりする。mbstring系として一括りに扱われることが多いけど実体はほとんど別物。
で、鬼車はJISに対応してないというのが動かない原因だった。


まー、ISO 2022エスケープシーケンスみたいな端から見ていかないとわからないような文字列で正規表現処理は厳しいよなぁ。