Функция strlen () php, задающая неправильную длину символов юникода

Я пытаюсь получить длину этой строки символов Unicode

$text = 'نام سلطان م'; $length = strlen($text); echo $length; 

вывод

 20 

Как он определяет длину строки символов Unicode?

Solutions Collecting From Web of "Функция strlen () php, задающая неправильную длину символов юникода"

strlen() не обрабатывает многобайтовые символы правильно, так как предполагает, что 1 char равно 1 байт, что просто недействительно для unicode. Это поведение описано здесь: http://php.net/strlen

strlen () возвращает количество байтов, а не количество символов в строке.

Решение заключается в использовании функции mb_strlen() вместо ( mb означает multi byte ) ( см. Mb_strlen () docs ).

РЕДАКТИРОВАТЬ

Если по какой-либо причине изменение кода невозможно / выполнимо, можно попытаться гарантировать, что строковые функции автоматически перегружаются многобайтовыми аналогами. Это поддерживается PHP и документируется здесь .

Обратите внимание, что вы также можете отредактировать php.ini чтобы убедиться, что mb_string работает так, как вы этого хотите. Доступные настройки описаны здесь .

Вы ищете mb_strlen .

Функция strlnen не подсчитывает количество символов, а количество байтов. Для многобайтовых символов он будет возвращать более высокие цифры.
mb_strlen() этого используйте mb_strlen() чтобы подсчитать фактическое количество символов.

Так же, как добавление к другому, ссылается на ссылку mb_strlen() :

Если параметр php.in mbstring.func_overload имеет бит 2, установленный в 1, то strlen будет подсчитывать символы на основе кодировки по умолчанию; в противном случае он будет подсчитывать количество байтов в строке