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

Shu Sawada luna @ lunanet.gr.jp
2007年 8月 2日 (木) 16:06:50 JST


さわだです。枡形さん、こんにちは。

>> 再現条件をちゃんと追っていないので何とも言えないのですが、指定した文字数より気持ち多めに
>> 切られてしまうことがありますので、検証は気を使った方が良いかもしれません。
> 
> http://jp.php.net/mb_strcut      => 文字列の一部を得る
> http://jp.php.net/mb_strimwidth  => 指定した幅で文字列を丸める
> http://jp.php.net/mb_strwidth    => 文字列の幅を返す
> 
> 元々の想定している用途が違うのではないでしょうか。
> そういう事ではない?

元々やりたかった処理は、まあ良くある話でVARCHAR(n)に不定長の自由入力データを収めたい、
mb_strimwidth( $str, 0, 400, "..." ) として、"ほげほげ..." という文字列を作りたかった、という
事でした。mb_strimwdith() は、こういう目的のためにある関数と理解しています。
が、期待していた長さで切ってくれないので、何故だろうとハマってしまった次第です。

そもそも論になっちゃう & すごく恥ずかしい質問なのかも知れないのですが、自分は mb_strcut() と
mb_strimwidth() の違いがよく理解できていないような気がしてきました。
mb_strimwidth の「丸める」っていうのは、400と指定したら400バイトに(または399バイト)で返して
くれるんじゃないか、という期待をしているんですが、ひょっとしてこれは根本的に誤解でしょうか(汗
また、mb_substr() も、400と指定したら、400バイト以内に収めてくれると理解しています。

「指定した幅widthで丸める」と「length パラメータで指定した str の一部を返します」の違いとは…??

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

なるほどです。
mb_strwidth() 的には幅400だと思っているので、mb_strimwidth()の動作としてはOKという感じ
でしょうか。
でもstrlen()だと405なので、そこはこれで正解?というところで引っかかったのが自分、と。

<?php
        $str = "※";
        echo strlen( $str ) . "\n";
        echo mb_strwidth( $str ) . "\n";
?>

$ ./t4.php
2
1

#これぐらいは調べてから書くように > 自分

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

ありがとうございます。
今ちょっと出先作業中なのでアレなのですが、時間あるときに遊ぶタネにさせていただきます。

本音としては、この動きは、ひゃー、という感じなんですが、根本的に自分が誤解していた
というオチになることを期待しています(苦笑

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


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