[PHP-dev 1167] ord と chr のマルチバイト文字バージョン

Takayuki Kito hawksnow @ mail2.dnet.gr.jp
2005年 9月 16日 (金) 00:24:18 JST


はじめまして。鬼頭と申します。
最近、マルチバイト文字列を処理するスクリプトをいろいろ作ってるのですが、
ord と chr のマルチバイト文字バージョンが標準で用意されていてもよいかも
と思ったので提案してみます。
実際に関数を書くと以下のような単純なものなんですけど。

function mb_chr($num){
  return ($num < 256) ? chr($num) : mb_chr($num / 256).chr($num % 256);
}

function mb_ord($char){
  return (strlen($char) < 2) ?
    ord($char) : 256 * mb_ord(substr($char, 0, -1)) + ord(substr($char, -1));
}

例えば文字コードが EUC-JP の場合、
print(mb_chr(42146)); // 'あ' を出力します
print(mb_ord('あ')); // 42146 を出力します

利用例なんですが、
例えば EUC-JP で書かれたソースコードの中で
部分的に Shift_JIS の文字列を書きたいという特殊な条件の場合に、
その文字列を整数の配列で定義しておいて
foreach の中で mb_chr を実行して文字列化する
などのパターンが考えられます。

ところで、mb_ord については以下のソースコードも考えたのですが、
処理が効率的なのはどっちなんでしょうか……。
substr の処理のしくみをよく知らないので私は判断しかねるのですが。
ただ、下のアルゴリズムのほうが substr の実行回数が少ないっぽいですね。

function mb_ord($char){
  $ord = 0;
  for($i = 0; $i < strlen($char); $i ++){
    $ord *= 256;
    $ord += ord(substr($char, $i, 1));
  }
  return $ord;
}

それでは失礼します。 



PHP-dev メーリングリストの案内