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

Использование iconv_strlen для определения длины строки в PHP
Раздел: Кодировки символов
iconv_strlen(string $string, ?string $encoding = null): int|false

Функция iconv_strlen в PHP предназначена для получения длины строки с учетом кодировки символов. Эта функция используется, когда необходимо корректно определить количество символов в строках с многобайтовыми кодировками, такими как UTF-8, где один символ может занимать несколько байтов.

Аргументы функции

Функция принимает три аргумента:

  1. string (обязательный) - входная строка, длину которой нужно определить.
  2. charset (необязательный) - кодировка строки. Если не указана, используется значение из iconv.internal_encoding.
  3. 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
Альтернативные функции в PHP

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

В PHP 8 был добавлен третий необязательный параметр substitute, который определяет строку замены для недопустимых символов. Если параметр не указан, поведение соответствует предыдущим версиям.

До PHP 8 при обнаружении недопустимого символа функция возвращала false. В PHP 8 можно задать замену:

echo iconv_strlen('Invalid\x80 char', 'UTF-8', '?');
13
Расширенные примеры

Работа с различными кодировками:

Пример php
$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+:

Пример php
$str = 'Valid\xE2\x82\xAC and invalid\x80 char';
$result = iconv_strlen($str, 'UTF-8', '?');
echo $result;
30

Сравнение производительности с mb_strlen:

Пример php
$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 сек

PHP iconv_strlen function comments

En
Iconv strlen Returns the character count of string