Функция strlen или mb_strlen?

09 мая 2017

Программисты работающие на языке php наверняка сталкивались с проблемой не корректной работы функции strlen предназначенной для подсчёта количества символов в строке. Иногда она даёт точное количество символов в строке, а иногда ошибается. Проблема здесь заключается в том, что функция strlen не всегда корректно обрабатывает кириллические символы, в то время как раскладку английского языка она всегда отрабатывает абсолютно точно.

Для того что бы разобраться, что на самом деле происходит, давайте рассмотрим работу функции strlen на очень простом примере:



Присвоим переменной $str два значения в первом случае это будет строка привет на русском языке, а во втором случае это будет строка privet на английском языке.

<?php
$str
= 'привет';
echo
strlen($str); // Ответ должен быть: 6

echo'<br>';

$str = 'privet';
echo
strlen($str); // Ответ должен быть: 6
?>


На первый взгляд, совершенно очевидно, что как в первом, так и во втором случае при отработке данного кода, мы увидим на экране ответ, что в обеих строках число символов равно 6-ти. Но на самом деле - это не так! После обработки функцией strlen(); строки на русском языке, мы увидим число 12-ть (хотя там может быть и иное число), а вот после обработки функцией strlen(); строки на английском языке, мы действительно увидим число 6-ть.

Что бы избавиться от подобной неопределённости, следует использовать функцию mb_strlen(); которая так же вычисляет длину строки, но использует два параметра. Первый параметр – это переменная содержащая строку, длину которой следует определить, а второй – это кодировка той самой строки.

Давайте рассмотрим приведённый выше пример, но на этот раз в качестве функции, вычисляющей длину строки будем использовать mb_strlen(); :

<?php
$str
= 'привет';
echo
mb_strlen($str, 'utf-8'); // Ответ должен быть: 6

echo'<br>';

$str = 'privet';
echo
mb_strlen($str, 'utf-8'); // Ответ должен быть: 6
?>

В данном случае, мы так же определяем количество символов в обеих строках, но помимо переменной $str в качестве параметра передаём ещё и кодировку utf-8. Теперь при вычислении количества символов обеих строк мы получим число 6-ть. Что соответствует действительности. Так что при определении количества символов в строке, написанной на кириллице следует использовать функцию mb_strlen(), а не strlen().

P.S. При передаче дополнительного параметра utf-8, функция mb_strlen(); всегда правильно вычисляет количество символов в строке написанной как на русском, так и на английском языках. Будет ли это работать на другом языке (например, китайском) я не знаю. Потому как опыта использования данного метода на иных языках у меня нет.

Наверх