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

Seiji Masugata s.masugata @ digicom.dnp.co.jp
2007年 8月 2日 (木) 15:17:26 JST


こんにちわ、桝形です。

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

http://jp.php.net/mb_strcut      => 文字列の一部を得る
http://jp.php.net/mb_strimwidth  => 指定した幅で文字列を丸める
http://jp.php.net/mb_strwidth    => 文字列の幅を返す

元々の想定している用途が違うのではないでしょうか。
そういう事ではない?

<?php
    mb_internal_encoding( "eucJP-win" );

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

    $ret = mb_strimwidth( $str, 0, 400 );
    echo   mb_strwidth( $str )."\n";
    print "length:" . strlen( $str ) . " bytes\n";
    print "length:" . strlen( $ret ) . " bytes\n";
    echo $ret."\n";

var_dump( mb_strwidth( '\n' ) );
var_dump( mb_strwidth( '1' ) );
var_dump( mb_strwidth( '※' ) );
var_dump( mb_strwidth( '、' ) );
var_dump( mb_strwidth( 'あ' ) );
var_dump( mb_strwidth( '。' ) );
var_dump( mb_strwidth( '・' ) );

?>

% php ./mb.php
400
length:405 bytes
length:405 bytes
※あああああああああああああああああああああああああ。ああああああああ。\n※あああああああああ1ああああああああああああ
あああああああああああああああ。\n※ああああああああああ・あああああ・あああああああああああああああああああああああああ
あああ。\n※あ、ああああああああああああああああああああああああああああああ。\n※ああああああああ、ああああああああああ
ああああああああああ、ああああああああああああ
int(2)
int(1)
int(1)
int(2)
int(2)
int(2)
int(2)

「※」が1になっているのは変な気がしますが、仮に、この結果を
無視した場合は一応、想定通りの挙動になっているようです。

mb_strcut
mb_strimwidth
mb_strwidth 

この辺はインターフェイスなので、処理の実体はmbfl内です。
(/php-src//ext/mbstring/libmbfl/mbfl/mbfilter.c)

-- 
Seiji Masugata <s.masugata @ digicom.dnp.co.jp>



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