Зачем использовать iconv_strpos вместо strpos? - PullRequest
2 голосов
/ 31 марта 2011

В отличие от 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

Ответы [ 2 ]

5 голосов
/ 31 марта 2011

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

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

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

5 голосов
/ 31 марта 2011

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

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

...