[PHP-users 32373] mb_strcutの挙動について

OhtsukiT ohtsukit @ gmail.com
2007年 7月 4日 (水) 15:38:57 JST


大槻と申します。お世話になります。
初めての投稿につき、不備・失礼がありましたらご指導頂ければ幸いです。

タイトル通りmb_strcutの挙動についてなのですが、マニュアルの内容と
違いがあるように思えるのでご意見を頂ければと思い投稿させて頂きます。

下のコードを実行した場合に、マニュアルの説明どおりであれば$formated_strの内容は、
「あ\nい\nう\nえ\nお\nか\nき\nく\nけ\nこ\n」となるはずだと思うのですが、実際は
「あ\nい\nう\nえ\nお\n」となります。
while内2度目のmb_strcutをした後の$dataをダンプすると1文字取りこぼしているようです。

問題自体は二度目の$sLengthをstrlen($ok)に変更することで対処できたのですが、
どうも合点がいかず悩んでおります。

PHPのバージョンも4.4.0から試してみたのですが、4.4.2以降で再現性があるようです。

よろしくお願い致します。

-------
環境
RedHat Linux Release 4 / Apache 1.3.37 / PHP 4.4.7

--------------------------ここから--------------------------
<?php
    $strings = 'あいうえおかきくけこ';
    $formated_str = format_string( $strings, 3, "EUC-JP");

    function format_string( $aStr, $aLength, $aEnc ) {

        //改行コードを\nに統一
        $aStr = ereg_replace("\r\n", "\n", $aStr);
        $aStr = ereg_replace("\r", "\n", $aStr);
        $arrLine = array();

        //改行毎に切り取って配列へ
        $arrLine = split("\n", $aStr);

        $result = "";
        foreach( $arrLine as $id => $data ) {

            // 1行が指定桁より長い場合
            if (strlen($data) > $aLength) {

                // 指定桁より長い場合mb_strcutで切取り
                while ( strlen($data) >= $aLength ) {
                    $ok = mb_strcut( $data, 0, $aLength, $aEnc );
                    $result .= $ok . "\n";
                    // 残りの部分を切取り
                    $data = mb_strcut( $data, $aLength, strlen($data), $aEnc );
                }
            }
            $result .= $data . "\n";
        }
        return $result;
    }
?>
--------------------------ここまで--------------------------


-------------
OhtsukiT


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