- ソースコードID: 351
- 登録日時: 2007/10/14 19:24
- 最終更新日時: 2007/10/15 11:17
- アクセス数: 3105
- タグ: php mb_strimwidth mb_strwidth
説明
ブログのコメント簡略表示のように、
"ある文字数をこえたら「...」を連結して省略"
ということをしたくて"mb_strimwidth"
結果、どうしても指定の文字数にならなくて
「これ本当にマルチバイトか?」と悩みました。
開発の際の文字コードはUTF-8。
echo
strlen('あいうえおかきくけこ'); => 30
echomb_strwidth('あいうえおかきくけこ','UTF-8'); => 20
'07/10/15
訂正:
mb_str_width,mb_strimwidthは文字数でもなくバイト数でもなく
「半角は幅1、全角は幅2として計算した文字列の幅」で結果を返すという仕様ということのようです。
それを勘違いして使っていてこの記事を書いてしまいました。
お詫びしておきます。
これに近い関数で今回の目的の文字数を丸める+指定文字連結を行う関数で
ですが自分の期待の結果が返ってこなかったので
以下のコードで対処しました。
'07/10/15
訂正:
mb_strimwidthの第3引数は
「トリムマーカを含めて計算した最大の文字幅」ということで、
「半角全角問わずに5文字まで表示して6文字以降は省略。
その際はトリムマーカをつける」
という動きをしたくてこのソースを書きました。
「半角10文字の幅で文字を丸めたい」などといった場合はこの関数を使えるとおもいます。
コメント

- 2:夜行
- 2007/10/14 23:24
検証を重ねないで出して投稿してしまってすみませんでした。
もしかするとうちの環境だけなのかわかりません・・・
できましたら協力してください。
ちなみに検証した結果です。
http://yakou850.ddo.jp/test.php
mb_strimwidth((変換文字列),
パラメータを0~50の範囲で10文字の文字列を丸めた結果を掲載しています。
パラメータが0から4までの間は文字が1文字も出ません。
これが正しいとすると、
(表示したい文字数×2)+3
という形式が、「UTF-8の場合のこの関数の第3引数」ということになると思いますが、なんとなく腑に落ちないので
記事に投稿したソースで対処しました。
間違えやご意見、他の情報などありましたら教えていただけますと幸いです。

- 3:reedom
- 2007/10/14 23:47
出力結果は関数仕様に沿っていると思います。
string
この関数は「$trimmarkerの文字幅を含めて」$width
収まるようトリミングします。
$trimmarker
みてください。

- 4:夜行
- 2007/10/14 23:55
そういうことですか!
すみません、ありがとうございます。
では、「指定の文字列を超えた場合にのみ、末尾にトリムマーカをつけて出力」という目的では
常に末尾にトリムマーカをつけるこの関数では使えないんですね。
mb_strimwidthを使う際は、
(指定の幅)-(トリムマーカの幅)しか文字がでないとも覚えておきます。

- 5:reedom
- 2007/10/15 10:11
ご自身の検証結果を見てみましょう。
「常に末尾にトリムマーカをつける」挙動になっていますか?
それと「指定の《文字列を超えた》場合にのみ」って、
意味がよくわかりませんよ。
投稿前に書いた文章を読み直してますか?
性急にならず、まずは冷静になってから。
必要なら一晩、二晩、あるいは一週間置いた後に行動してみては
いかがでしょう。

- 6:夜行
- 2007/10/15 11:17
ご指摘ありがとうございます。
「半角全角問わずに50文字まで表示して、51文字以降は省略。
省略を行った場合にのみトリムマーカをつける」
という仕様にしたかったのでこの関数を使うのはあきらめました。
>「常に末尾にトリムマーカをつける」
「トリムマーカの幅を計算に含める」ということを表現したかったのですが、こんな文章になってしまいました。
>「指定の《文字列を超えた》場合にのみ」
「指定の《文字数を超えた》場合にのみ」の間違いです。
今後は読み直してから投稿したいとおもいます。
本文のほうも一部訂正しました。
前へ 1 次へ![]()
コメントする
[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。
[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。











Widthという単語は「幅」という意味です。 count や length がよく使われます。
php-5.2.4/ext/mbstring/mbstring.c の 関数定義のコメントでは
"Trim the string in terminal width"
mb_strimwidthなどでは「画面上の幅」を意味しています。
半角は1、全角は2。
文字数ということでは
プログラマが意図したとおりにコードが動かないとき、
ほとんどの場合で書いた本人に落ち度があるものです。
冷静になった上で十分に調査を行い、検証を重ねて確証を
得た上で投稿なりなんなりの行動を起こすことをお勧めします。
ちなみに
mb_strimwidth
と記述されています。
php.netのマニュアルでもこのように簡潔でわかりやすい表現
がされていれば誤解されることもなかったという気がしない
でもありません...。