PHP関数の気になる関数(2) mb_strwidth mb_strimwidth
夜行
夜行
ATOMRSS
  • ソースコードID: 351
  • 登録日時: 2007/10/14 19:24
  • 最終更新日時: 2007/10/15 11:17
  • アクセス数: 1533
  • タグ:  php mb_strwidth mb_strimwidth
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加
  • GoodJob
  • 1

GJ

説明

 ブログのコメント簡略表示のように、
"ある文字数をこえたら「...」を連結して省略"
ということをしたくて"mb_strimwidth" を使ってみました。
結果、どうしても指定の文字数にならなくて
「これ本当にマルチバイトか?」と悩みました。
開発の際の文字コードはUTF-8。

echo strlen('あいうえおかきくけこ');  => 30
echo mb_strwidth('あいうえおかきくけこ','UTF-8'); => 20

'07/10/15 訂正:
mb_str_width, mb_strimwidthは文字数でもなくバイト数でもなく
「半角は幅1、全角は幅2として計算した文字列の幅」で結果を返すという仕様ということのようです。
それを勘違いして使っていてこの記事を書いてしまいました。
お詫びしておきます。

 これに近い関数で今回の目的の文字数を丸める+指定文字連結を行う関数で "mb_strimwidth" を使ってみました。
ですが自分の期待の結果が返ってこなかったので
以下のコードで対処しました。

'07/10/15 訂正:
mb_strimwidthの第3引数は
「トリムマーカを含めて計算した最大の文字幅」ということで、
「半角全角問わずに5文字まで表示して6文字以降は省略。
 その際はトリムマーカをつける」
という動きをしたくてこのソースを書きました。
「半角10文字の幅で文字を丸めたい」などといった場合はこの関数を使えるとおもいます。

ソースコード

コメント

Widthという単語は「幅」という意味です。
mb_strimwidthなどでは「画面上の幅」を意味しています。
半角は1、全角は2。
文字数ということでは count や length がよく使われます。

プログラマが意図したとおりにコードが動かないとき、
ほとんどの場合で書いた本人に落ち度があるものです。
冷静になった上で十分に調査を行い、検証を重ねて確証を
得た上で投稿なりなんなりの行動を起こすことをお勧めします。

ちなみに php-5.2.4/ext/mbstring/mbstring.c 
mb_strimwidth 関数定義のコメントでは
 "Trim the string in terminal width" 
と記述されています。
php.netのマニュアルでもこのように簡潔でわかりやすい表現
がされていれば誤解されることもなかったという気がしない
でもありません...。

  • GoodJob
  • 0

検証を重ねないで出して投稿してしまってすみませんでした。
もしかするとうちの環境だけなのかわかりません・・・
できましたら協力してください。

ちなみに検証した結果です。
http://yakou850.ddo.jp/test.php

mb_strimwidth((変換文字列), 0, (パラメータ), "...", "UTF-8")という形式で
パラメータを0~50の範囲で10文字の文字列を丸めた結果を掲載しています。

パラメータが0から4までの間は文字が1文字も出ません。
これが正しいとすると、
(表示したい文字数×2)+3
という形式が、「UTF-8の場合のこの関数の第3引数」ということになると思いますが、なんとなく腑に落ちないので
記事に投稿したソースで対処しました。

間違えやご意見、他の情報などありましたら教えていただけますと幸いです。

  • GoodJob
  • 0

出力結果は関数仕様に沿っていると思います。

string mb_strimwidth 
  string $str, 
  int $start, 
  int $width 
  [, string $trimmarker [, string $encoding]] )

この関数は「$trimmarkerの文字幅を含めて」$width 幅以内に
収まるようトリミングします。
$trimmarker を 「.」や「....」などと変えながら試して
みてください。

  • GoodJob
  • 0

そういうことですか!
すみません、ありがとうございます。
では、「指定の文字列を超えた場合にのみ、末尾にトリムマーカをつけて出力」という目的では
常に末尾にトリムマーカをつけるこの関数では使えないんですね。

mb_strimwidthを使う際は、
(指定の幅)-(トリムマーカの幅)しか文字がでないとも覚えておきます。

  • GoodJob
  • 0

ご自身の検証結果を見てみましょう。
「常に末尾にトリムマーカをつける」挙動になっていますか?
それと「指定の《文字列を超えた》場合にのみ」って、
意味がよくわかりませんよ。
投稿前に書いた文章を読み直してますか?

性急にならず、まずは冷静になってから。
必要なら一晩、二晩、あるいは一週間置いた後に行動してみては
いかがでしょう。

  • GoodJob
  • 0

ご指摘ありがとうございます。
「半角全角問わずに50文字まで表示して、51文字以降は省略。
 省略を行った場合にのみトリムマーカをつける」
という仕様にしたかったのでこの関数を使うのはあきらめました。

>「常に末尾にトリムマーカをつける」
「トリムマーカの幅を計算に含める」ということを表現したかったのですが、こんな文章になってしまいました。

>「指定の《文字列を超えた》場合にのみ」
「指定の《文字数を超えた》場合にのみ」の間違いです。

今後は読み直してから投稿したいとおもいます。
本文のほうも一部訂正しました。

  • GoodJob
  • 0

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ソースコードのブログパーツ

デフォルトのフォントサイズ
修飾
表示サイズ
px px
プレビュー (表示する)
下のプレビュー領域をクリックすると、ポップアップで全体を見ることができます。
パラメータが不正です

    GoodJobしたユーザ

    • ryotaro

    ブックマークコメント

    • Icon_bm_hatebu mb_substrで文字数カットして文末に「...」を付ける。 (headache)

    関連するなにがし

    前へ 1 次へ