1
3

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 1 year has passed since last update.

mb_strlen()の文字列の長さは文字エンコーディングによって可変するという話

Last updated at Posted at 2022-09-16

概要

strlen() は文字列の長さをバイト数で返し、
mb_strlen() は文字列の長さを取得するとよく書かれるが
そもそも文字コードはどうなっているのか?

答え

PHPの公式を見てみる

説明には文字列の長さを得るとだけ書かれているが
パラメータにはしっかりと$encodingが書かれている

mb_strlen(string $string, ?string $encoding = null): int
  • encoding
    encoding パラメータには文字エンコーディングを指定します。省略した場合、
    もしくは null の場合は、 内部文字エンコーディングを使用します。

内部文字エンコーディングとは?

PHP.iniで文字のエンコーディングを設定できるみたいです。

mbstring.internal_encoding string
警告
この非推奨の機能は、きっと 将来 削除 されるでしょう。
内部文字エンコーディングのデフォルト値を定義します。
この値は空のままにしておいて、代わりに default_charset を設定すべきです。

mbstring.internal_encoding は空にしてdefault_charset を設定すべきと。
そしてdefault_charsetでは

default_charset string
"UTF-8" がデフォルトの値です。 htmlentities() や html_entity_decode() そして htmlspecialchars() で encoding パラメータを省略した場合は、このデフォルト値を利用します。

なるほど
元々、UTF-8が設定されているから
エンコーディングの引数を入れなくても正常に文字数を取得できていたんですね!

結論

php.iniで変更されるリスクがあるなら
引数にはUTF-8を入れておきたいところですね。

mb_strlen('一意専心', 'UTF-8')
// 出力結果: int(4)

mb_strlen('一意専心', 'SJIS')
// 出力結果: int(7)
1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?