PHP
標準関数の罠?
strlen
mb_strlen

[関数系] mb_strlenとstrlenに罠はないのか

概要

マルチバイト文字を処理するということしかわかっていなかったので、本当に
他に違いはないのか知りたかったので調査がてら。

試した環境

php -v                                                                                                                                                                                                           [/Users/oki.suguru/dev-environment/core]
PHP 7.2.6 (cli) (built: May 25 2018 06:18:07) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.6, Copyright (c) 1999-2018, by Zend Technologies

内容

mb_strlen

概要

マルチバイト文字に対して文字列の長さがどのくらいかを返す標準関数。

引数

マルチバイトではない文字列を引数にとったらどうなるのか

var_dump(mb_strlen('123456'));
int(6)

正常に動く模様。

@tadsan さんのコメントより追記

  1. PHPの文字列値はエンコーディング情報が付随しない。
  2. mb_strlen()には文字エンコーディング名(通常は'UTF-8')を明示的に指定した方が安全
  3. 引数を省略した場合はmb_internal_encoding()で設定された値が利用されるので、できるだけ省略しないことをおすすめする。
mb_internal_encoding()

php.iniの

mbstring.internal_encoding

を設定する標準関数。これを指してだいたい「内部文字エンコーディング」とか「内部文字エンコード」と呼んだりする。

標準関数 ini_set でも同じことができる。

php > var_dump(ini_set('mbstring.internal_encoding', 'UTF-8'));

Deprecated: ini_set(): Use of mbstring.internal_encoding is deprecated in php shell code on line 1
string(0) ""

mb_string系の一部の機能は5.6系から非推奨となっているため、利用しない方が良いかもしれない。

参考→PHP 5.6.x で推奨されなくなる機能 - iconv および mbstring のエンコーディング設定

 マルチバイトの引数を取った場合(正常系)

php > var_dump(mb_strlen('マルチバイト'));
int(6)

strlen

概要

マルチバイト文字以外の文字列に対して文字列の長さがどのくらいかを返す標準関数。

引数

マルチバイトの文字列を引数にとる場合(異常系)

php > var_dump(strlen('マルチバイト'));
int(18)

strlen()は、マニュアルで説明される通り文字数ではなくバイト数を返す