[PHP-users 32515] Re: マルチバイト文字を含む文字列のカットについて

Shu Sawada luna @ lunanet.gr.jp
2007年 8月 2日 (木) 14:23:01 JST


さわだと申します。

> 高木様の教えてくださったmb_strimwidth()を使用して、
> 解決することができました。

もう解決しているようですので蛇足になりますが、先日私、この関数でバグ出してしまいました。
再現条件をちゃんと追っていないので何とも言えないのですが、指定した文字数より気持ち多めに
切られてしまうことがありますので、検証は気を使った方が良いかもしれません。

再現コード)
------------------
#!/usr/bin/php
<?php
    mb_internal_encoding( "eucjp-win" );

    $str = '※あああああああああああああああああああああああああ。ああああああああ。\n※あああああああああ1あああああああああああああああああああああああ>
ああああ。\n※ああああああああああ・あああああ・ああああああああああああああああああああああああああああ。\n※あ、ああああああああああああああああああああ
ああああああああああ。\n※ああああああああ、ああああああああああああああああああああ、ああああああああああああ';

    //mb_strimwidth()
    $ret = mb_strimwidth( $str, 0, 400 );
    print 'mb_strimwdith( $str, 0, 400 )' . " - result:\n";
    print $ret . "\n";
    print "length:" . strlen( $ret ) . " bytes\n";

    print "\n";

    //mb_strcut
    $ret = mb_strcut( $str, 0, 400 );
    print 'mb_cut( $str, 0, 400 )' . " - result:\n";
    print $ret . "\n";
    print "length:" . strlen( $ret ) . " bytes\n";
?>
------------------

#$str ='' は1行で、間にスペース、タブは入りません

実行結果 CentOS4.4.3, PHP 5.1.6 (cli)
------------------
[luna@***** ~]$ ./t3.php
mb_strimwdith( $str, 0, 400 ) - result:
※あああああああああああああああああああああああああ。ああああああああ。\n※あああああああああ1あああああああああああああああああああああああああああ。\n ※ああああああああああ・あああああ・ああああああ
ああああああああああああああああああああああ。\n※あ、ああああああああああああああああああああああああああああああ。\n※ああああああああ、ああああああああああああああああああああ、ああああああああああああ
length:405 bytes

mb_cut( $str, 0, 400 ) - result:
※あああああああああああああああああああああああああ。ああああああああ。\n※あああああああああ1あああああああああああああああああああああああああああ。\n ※ああああああああああ・あああああ・ああああああ
ああああああああああああああああああああああ。\n※あ、ああああああああああああああああああああああああああああああ。\n※ああああああああ、ああああああああああああああああああああ、あああああああああ
length:399 bytes
------------------

ということで、mb_strimwidth() だと405byteになってしまうケースがあります。
原因は追っていません。(すみません)

過去ログだと、この辺と同じ事象と思っています。
http://ml.php.gr.jp/pipermail/php-users/2004-November/024264.html


ご参考まで。

-- 
Shu Sawada
http://luna.lunanet.gr.jp/
http://www.cycleof5th.com/


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