Зачем использовать iconv_strpos вместо strpos?

В отличие от strpos(), возвращаемое значение iconv_strpos() — это количество символов перед иглой, а не смещение в байтах до позиции, где была найдена игла. (Источник: http://www.php.net/manual/en/function.iconv-strpos.php)

В следующем примере кода показано, что iconv_strpos() и strpos() возвращают одинаковые значения.

$string = "dd.MM.yy";

echo "d: ".strpos($string, 'd'); // 0
echo "M: ".strpos($string, 'M'); // 3
echo "y: ".strpos($string, 'y'); // 6

echo "d: ".iconv_strpos($string, 'd'); // 0
echo "M: ".iconv_strpos($string, 'M'); // 3
echo "y: ".iconv_strpos($string, 'y'); // 6

Почему я должен использовать iconv_strpos вместо strpos?


person flather    schedule 31.03.2011    source источник
comment
Вы когда-нибудь пробовали работать с текстом вида АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ? Если вы получили что-то подобное из базы данных (UTF8), использование strpos() не решит проблему получения определенной позиции символов. Не используйте strpos(), если вы пытаетесь получить позиции в строке, отличной от ANSI.   -  person Wh1T3h4Ck5    schedule 31.03.2011


Ответы (2)


Обычно это актуально только при использовании многобайтовых кодировок, таких как UTF-8 или UTF-16.

Символ может состоять из нескольких байтов (это относится к не 7-битным символам ASCII в UTF-8, они имеют переменную длину кодирования. UTF-16 имеет 2-байтовые символы).

person Arc    schedule 31.03.2011

Когда вы используете многобайтовые кодировки, один символ может быть представлен переменным числом байтов (например, в UTF-8 от 1 до 4). Это отличается от однобайтовых кодировок, где каждый байт всегда представляет ровно один символ.

Рассмотрим двухсимвольную строку, закодированную в UTF-8, где первый символ занимает 3 байта для представления, а второй символ занимает только 1 (все символы с порядковым номером ‹ 128 имеют это свойство в UTF-8, поэтому давайте использовать 'a' для представления пример).

В этой ситуации iconv_strpos($string, 'a') вернет 1 (второй символ — 'a'), а strpos($string, 'a') вернет 3 (относительно четвертого символа, поскольку он не может сказать, что первые три байта на самом деле являются просто одним символом; предполагает, что кодировка однобайтовая).

person Jon    schedule 31.03.2011