[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 メーリングリストの案内