StaDi
@StaDi
Курьер в it отделе

Баг в функции strpos?

Почему php указывает не верную позицию символа, что я делаю не так?

$str = "абв";
var_dump(strpos($str,"б"));

Результат: 2, а должен быть 1
  • Вопрос задан
  • 3689 просмотров
Решения вопроса 2
KorsaR-ZN
@KorsaR-ZN
Так это у вас наверняка utf-8 кодировка, а кириллица занимает 2 байта. Используйте для этого mb_* функции
Ответ написан
StaDi
@StaDi Автор вопроса
Курьер в it отделе
Для тех кто после будет искать.
Фишка в том, что функция strpos работает с байтами, а не символами.
Символ в юникоде (utf) может занимать от 1 до 6 байт.
Поэтому нужно использовать функцию для многобайтовых строк, а именно в данном случае:

Первый вариант. Используем функцию mb_strpos.
mb_strpos("Строка в которой ищем символ(ы) вхождения", "символ", 0, UTF-8);

Второй вариант. Удобен если работаем и с другим байтовыми функциями.
Задаём внутреннею кодировку mb_internal_encoding()
mb_internal_encoding(UTF-8);
mb_strpos("Строка в которой ищем символ(ы) вхождения", "символ");

# Покажет текущею кодировку
echo mb_internal_encoding();


Есть и третий вариант, можно перегрузить функции и использовать strpos как человек.

---
Всем ответившим, спасибо за помощь!
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
kovalyov_makc
@kovalyov_makc
Программист, разработка на python, golang, php
php.net/manual/ru/function.strpos.php
Читать мануалы никто не запрещал.
Ответ написан
упомяну, что бездумно использовать mb_*, особенно с большим количеством данных, не стоит, т.к. функции намного медленнее работают их однобайтных коллег.
Использовать следует только при работе с многобайтными кодировками. Если же вы ищите латиницу, даже на странице с кириллицей, то используйте все равно strpos.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы