mb_strlenと改行コードの罠

PHPのmb_strlenはCR+LFを2文字(バイトではなく文字な所に注意)として認識するため、CR+LFとLFが混在するような使い方をされた場合に、思った通りにコードが動かないことがある。

下記コードを参考にして貰うと解るがCR+LFは2文字と解釈される。
これに対する簡単な対策としては事前にCR+LFをLFに置き換えてから評価するのが良いだろう。

<?php
$str = "\r";
printf("LF = %s\n", mb_strlen($str));

$str = "\r\n";
printf("CR+LF = %s\n", mb_strlen($str));

$str = str_replace("\r\n", "\n", $str);
printf("CR+LF -> LF = %s\n", mb_strlen($str));

?>


実行結果はこちら

[root@host test]$ php test.php
LF = 1
CR+LF = 2
CR+LF -> LF = 1

・・・しかし、他の処理系だとCR+LFは一文字としてカウントするのが普通では無かろうか?
これはちょっとばかり不親切だよな〜〜