Функция strlen или mb_strlen?
09 мая 2017- Информация о материале
- Автор: Долматов Вячеслав
- Просмотров: 10283
Программисты работающие на языке php наверняка сталкивались с проблемой не корректной работы функции strlen предназначенной для подсчёта количества символов в строке. Иногда она даёт точное количество символов в строке, а иногда ошибается. Проблема здесь заключается в том, что функция strlen не всегда корректно обрабатывает кириллические символы, в то время как раскладку английского языка она всегда отрабатывает абсолютно точно.
Для того что бы разобраться, что на самом деле происходит, давайте рассмотрим работу функции strlen на очень простом примере:
Присвоим переменной $str два значения в первом случае это будет строка привет на русском языке, а во втором случае это будет строка privet на английском языке.
$str = 'привет';
echo strlen($str); // Ответ должен быть: 6
echo'<br>';
$str = 'privet';
echo strlen($str); // Ответ должен быть: 6
?>
На первый взгляд, совершенно очевидно, что как в первом, так и во втором случае при отработке данного кода, мы увидим на экране ответ, что в обеих строках число символов равно 6-ти. Но на самом деле - это не так! После обработки функцией strlen(); строки на русском языке, мы увидим число 12-ть (хотя там может быть и иное число), а вот после обработки функцией strlen(); строки на английском языке, мы действительно увидим число 6-ть.
Что бы избавиться от подобной неопределённости, следует использовать функцию mb_strlen(); которая так же вычисляет длину строки, но использует два параметра. Первый параметр – это переменная содержащая строку, длину которой следует определить, а второй – это кодировка той самой строки.
Давайте рассмотрим приведённый выше пример, но на этот раз в качестве функции, вычисляющей длину строки будем использовать mb_strlen(); :
$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(); всегда правильно вычисляет количество символов в строке написанной как на русском, так и на английском языках. Будет ли это работать на другом языке (например, китайском) я не знаю. Потому как опыта использования данного метода на иных языках у меня нет.