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
$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.
$emoji = "????????????????"; // Семья (4 персонажа)
echo 'mb_strlen: ' . mb_strlen($emoji) . '\n';
echo 'grapheme_strlen: ' . grapheme_strlen($emoji);mb_strlen: 7 grapheme_strlen: 1
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)
$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 корректно обрабатывает строки, содержащие нулевые байты, в отличие от некоторых других строковых функций.
$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