Iconv strlen: примеры (PHP)
iconv_strlen(string $string, ?string $encoding = null): int|falseФункция iconv_strlen в PHP предназначена для получения длины строки с учетом кодировки символов. Эта функция используется, когда необходимо корректно определить количество символов в строках с многобайтовыми кодировками, такими как UTF-8, где один символ может занимать несколько байтов.
Функция принимает три аргумента:
- string (обязательный) - входная строка, длину которой нужно определить.
- charset (необязательный) - кодировка строки. Если не указана, используется значение из
iconv.internal_encoding. - substitute (необязательный, доступен с PHP 8) - строка, используемая для замены недопустимых символов в кодировке.
Простое определение длины строки в UTF-8:
echo iconv_strlen('Привет, мир!', 'UTF-8');13
Использование внутренней кодировки:
iconv_set_encoding('internal_encoding', 'CP1251');
echo iconv_strlen('Пример строки');13
Сравнение с обычной strlen для UTF-8:
$str = 'Строка';
echo 'strlen: ' . strlen($str) . '\n';
echo 'iconv_strlen: ' . iconv_strlen($str, 'UTF-8');strlen: 12 iconv_strlen: 6
mb_strlen - функция из расширения mbstring, также определяет длину строки с учетом кодировки. Поддерживает больше параметров и кодировок. Предпочтительнее при работе с различными многобайтовыми кодировками.
grapheme_strlen - функция из расширения intl, учитывает графемные кластеры в Unicode. Наиболее точна для подсчета видимых символов в сложных случаях (например, эмодзи с модификаторами).
strlen - стандартная функция PHP, считает байты, а не символы. Используется только для однобайтовых кодировок.
Python: метод len() для строк Unicode возвращает количество символов:
text = 'Привет, мир!'
print(len(text))13
JavaScript: свойство length строки считает кодовые единицы UTF-16, что может давать неверные результаты для суррогатных пар:
console.log('Привет, мир!'.length);
console.log('????'.length);13 2
MySQL: функция CHAR_LENGTH() возвращает количество символов:
SELECT CHAR_LENGTH('Привет, мир!');13
Некорректная кодировка приводит к возврату false:
var_dump(iconv_strlen('Текст', 'UNKNOWN_ENCODING'));bool(false)
Использование неподходящей кодировки для строки:
$str = mb_convert_encoding('Пример', 'Windows-1251', 'UTF-8');
echo iconv_strlen($str, 'UTF-8');false
Передача нестрокового значения:
var_dump(iconv_strlen(12345, 'UTF-8'));int(5)
В PHP 8 был добавлен третий необязательный параметр substitute, который определяет строку замены для недопустимых символов. Если параметр не указан, поведение соответствует предыдущим версиям.
До PHP 8 при обнаружении недопустимого символа функция возвращала false. В PHP 8 можно задать замену:
echo iconv_strlen('Invalid\x80 char', 'UTF-8', '?');13
Работа с различными кодировками:
$str_utf8 = 'Hello 世界!';
$str_cp1251 = iconv('UTF-8', 'CP1251', 'Привет');
echo iconv_strlen($str_utf8, 'UTF-8') . '\n';
echo iconv_strlen($str_cp1251, 'CP1251');9 6
Использование параметра substitute в PHP 8+:
$str = 'Valid\xE2\x82\xAC and invalid\x80 char';
$result = iconv_strlen($str, 'UTF-8', '?');
echo $result;30
Сравнение производительности с mb_strlen:
$str = str_repeat('Тест', 10000);
$time1 = microtime(true);
iconv_strlen($str, 'UTF-8');
$time2 = microtime(true);
mb_strlen($str, 'UTF-8');
$time3 = microtime(true);
echo 'iconv_strlen: ' . ($time2 - $time1) . ' сек\n';
echo 'mb_strlen: ' . ($time3 - $time2) . ' сек';iconv_strlen: 0.00012 сек mb_strlen: 0.00008 сек