Mb strlen: примеры (PHP)

Функция mb_strlen в PHP для работы с многобайтовыми строками
Раздел: Многобайтовые строки
mb_strlen(string $string, ?string $encoding = null): int

Функция mb_strlen в PHP

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

Когда используется

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

Аргументы функции
  • string (обязательный): Исходная строка, длину которой нужно определить.
  • encoding (необязательный): Параметр, указывающий кодировку строки. Если не указан, используется внутренняя кодировка, установленная функцией mb_internal_encoding().

Короткие примеры использования mb_strlen

Базовое использование

Определение длины строки в UTF-8.

echo mb_strlen('Привет, мир!'); // 12 символов (пробел и восклицательный знак тоже считаются)
12
С указанием кодировки
$str = 'Hello, 世界!';
echo mb_strlen($str, 'UTF-8');
10
Сравнение с strlen
$str = 'тест';
echo 'strlen: ' . strlen($str) . '\n'; // 8 байт
echo 'mb_strlen: ' . mb_strlen($str);    // 4 символа
strlen: 8
mb_strlen: 4

Похожие функции в PHP

  • strlen() — определяет длину строки в байтах. Используется для бинарных данных или однобайтовых кодировок (например, ASCII).
  • iconv_strlen() — аналог mb_strlen из библиотеки iconv. Работает схожим образом, но имеет меньше настроек по умолчанию. Выбор зависит от предпочитаемого расширения (mbstring или iconv).
  • grapheme_strlen() из модуля intl — учитывает графемные кластеры (например, символы с акцентами, составные эмодзи), что обеспечивает еще более точный подсчет видимых символов. Предпочтительна для сложных лингвистических задач.

Типичные ошибки

Неявное использование кодировки по умолчанию

Если не установлена внутренняя кодировка mbstring или не передан параметр encoding, результат может быть неожиданным.

// Внутренняя кодировка — ASCII
mb_internal_encoding('ASCII');
$str = 'тест';
echo mb_strlen($str); // Символы вне ASCII считаются некорректно
4 (но каждый символ считается как 1, хотя в ASCII они не представлены)
Передача некорректной кодировки
echo mb_strlen('abc', 'UNKNOWN_ENCODING');
Warning: mb_strlen(): Unknown encoding "UNKNOWN_ENCODING"
Использование с нестроковыми типами
echo mb_strlen(12345); // Приведение к строке
5

Изменения в последних версиях PHP

  • В PHP 8.0 параметр encoding стал необязательным (nullable). Передача null теперь использует внутреннюю кодировку. Ранее передача null могла интерпретироваться как пустая строка, что вело к ошибкам.
  • С PHP 7.4 устарело использование нестандартных кодировочных псевдонимов (например, 'UTF8' вместо 'UTF-8'). Рекомендуется использовать официальные имена.

Расширенные примеры

Подсчет символов с учетом графемных кластеров

Для эмодзи, состоящих из нескольких кодовых точек, mb_strlen может считать их как несколько символов. Более точный подсчет — через grapheme_strlen.

Пример php
$emoji = "????‍????‍????‍????"; // Семья (4 персонажа)
echo 'mb_strlen: ' . mb_strlen($emoji) . '\n';
echo 'grapheme_strlen: ' . grapheme_strlen($emoji);
mb_strlen: 7
grapheme_strlen: 1
Использование для валидации длины поля формы
Пример php
function validateFieldLength($value, $min, $max) {
    $len = mb_strlen(trim($value));
    return ($len >= $min && $len <= $max);
}
// Проверка имени пользователя (от 2 до 30 символов)
$isValid = validateFieldLength('Анна-Мария', 2, 30);
var_dump($isValid);
bool(true)
Определение длины строки в разных кодировках
Пример php
$str = 'Hello!';
echo 'UTF-8: ' . mb_strlen($str, 'UTF-8') . '\n';
echo 'Windows-1251: ' . mb_strlen($str, 'Windows-1251');
UTF-8: 6
Windows-1251: 6
Обработка строк с нулевым байтом

mb_strlen корректно обрабатывает строки, содержащие нулевые байты, в отличие от некоторых других строковых функций.

Пример php
$str = "abc\0def";
echo mb_strlen($str);
7

Альтернативы в других языках

Mb strlen в Python

Используется функция len(), которая по умолчанию работает с символами (кодовыми точками Unicode).

text = 'Привет, мир!'
print(len(text))
12

Mb strlen в Javascript

Свойство строки length считает кодовые единицы UTF-16, что может дать неверный результат для некоторых символов (например, эмодзи). Для точного подсчета используется [...str].length или Array.from(str).length.

let str = 'Привет';
console.log(str.length); // 6 кодовых единиц
console.log([...str].length); // 6 символов
6
6

Mb strlen в MySQL

Функция CHAR_LENGTH() возвращает длину строки в символах, а LENGTH() — в байтах.

SELECT CHAR_LENGTH('Привет');
6

PHP mb_strlen function comments

En
Mb strlen Get string length