概要
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)