[PHP-users 7669] Re: explode関数について

Osamu Shigematsu php-users@php.gr.jp
Mon, 27 May 2002 11:33:18 +0900


重松です。こんにちは。

On Friday, May 24, 2002, at 07:37  PM, 尾曽 貴弘 wrote:
> 原因は"|"と"ポ"のキャラクターコードにあるようです。
>
> "|"	: キャラクターコード 0x7C
> "ポ"	: キャラクターコード 0x837C
>
> つまり、explode関数内で"ポ"の2バイト目の0x7Cがセパレータとして認識
> されてしまい上のような結果になってしまうようです。

ということまでわかっているのなら、ものすごく解決策は簡単だと思いますが。

> PHPの4.2.0ではmb_splitという関数があるようですが、現状が4.1.2なので
> この関数が使えません。

で、PHP 4.2.1 に積極的にしない理由がわかりませんが、

(1) デリミタの | を別の文字にする。Shift_JIS の 2 バイト目には、0x00 -- 0x1f までの
文字は来なかったと記憶していますから、必ず 1 バイト文字でしか使用されない文字を
デリミタとして使用することでこの問題は回避可能です。
# CJVK の表が見やすいです。今手元にないので、ちょっと調べられなくて申し訳ない。

(2) マルチバイト系の正規表現関数で代替する。あるいは、デリミタを上記 (1) で示した
文字 (列) に置換後に explode にて処理を行う。

ということでいかがですか。

あるいは、utf-8 を使えば、すべてのマルチバイト文字について考慮されていない関数も
自動的にマルチバイト文字対応になります。(うまい表現が見あたらないですが。。。)
これは、utf-8 の 2 バイト目以降は、1 バイト目にくる文字が絶対に来ないためです。
けど、日本語は一般的に 3 バイト必要になりますので効率は良くありません。
また、理論的には、1 文字を表すのに 6 文字必要になることもあり得ます。

で、便乗質問なんですが、explode() のマルチバイト版が存在しないようですが、
mb_split() は正規表現のコンパイルのオーバーヘッドがあるので、
mb_explode() があればと思いますが、私は見落としているだけでしょうか。。。

--
Osamu Shigematsu
mailto:shige@ravi.ne.jp