2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【初心者】【PHP】strlenとmb_strlenを勘違いした話

Posted at

##結論
初心者が調子づいてきた頃にやりがちだけど、
具体的な言葉で検索しようね、そして説明はよく読もうね! と言う話。

##詰まりの始まり
私がPHP開発をしていたある日、処理の中で文字列の文字数カウントが必要になりました。
##「PHP 文字列 長さ」で検索する
すると出てきたのは

  • 文字列の長さを取得(strlen, mb_strlen) →というまとめ記事
  • strlen - Manual - PHP →というPHP公式ページ
  • mb_strlen - PHP →PHP公式ページ

それを見た素人はこう思いました。
###「ははーん、strlenを使えばいいんだな?」
殴りたくなる思考回路ですが、こんなクソとぼけたゴミがいるのも事実です。

そんな複雑ではない関数だろうと思い込み、
公式の説明など読まないままstrlenを自分が作成していた処理に当て込みました。

##一向に想定とは違う動きをするstrlen

strlen('あいうえお');

5を返すはずのこの関数、

int(15)

一向に3倍の文字数を返すのをやめてくれません。
慌ててPHP公式のstrlenを読みます。

strlen — 文字列の長さを得る

説明 ¶
strlen ( string $string ) : int
与えられた string の長さを返します。

why!? PHPeople!?
合ってるじゃんと公式に文句を吐きながら、まとめ記事を読み漁った結果、
無事に「文字列の長さ**(バイト数)**」を返す関数だと理解してここに至ります。

書くまでも無いでしょうが、全角や半角を含む文字数をカウントしたい場合は
mb_strlenを使いましょう。

##なぜ素人がそういう失敗に陥ったのか

  • 文字数をカウントしてくれる関数に種類なんてないという思い込み
  • そこからくる説明を読まないという怠惰

そして

  • 文字列の長さという曖昧な表現での検索

これが理由だと思っています。
上記2つは言うまでもない、私自身のゴミ精神が招いたことです。

話したいのは3つ目です。
「文字列の長さ」はバイト数、文字数、両方に捉えられる言葉です。

たとえば「画像のサイズ」と聞いた時、

  • 「画像の横幅と縦幅」
  • 「画像ファイルのバイト数」

この2つが想定されるように、「長さ」や「大きさ」といった言葉は
意味を広く取れてしまう、という意味で自分が想定しない結果を
連れてくることがあるのではないでしょうか。

今回も、「PHP 文字列 文字数」で検索をしていれば
strlenよりもmb_strlenが検索結果の上位にきていました。

具体的な検索をすること、そしてよく読み、理解すること。
初心者が調子に乗り出してきた頃にはよくある話だと思うので気をつけましょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?