mb strpos против strpos, какая разница?

Да: я знаю. Мы должны использовать функцию mb_* при работе с многобайтовым символом. Но когда мы используем strpos? Давайте посмотрим этот код (сохраненный в utf-8)

var_dump(strpos("My symbol utf-8 is the €.", "xE2x82xAC")); // int(23)

есть разница в использовании mb_strpos? Разве это не одно и то же? Ведь не strpos искать строка (несколько байт)? Есть ли причина использовать вместо strpos?

2 ответов


для UTF-8 соответствие последовательности байтов точно такое же, как соответствие последовательности символов.

таким образом, они оба найдут иглу в одной и той же точке, но mb_strpos рассчитывает полный UTF-8 байт sequencees до Игла, где, как strpos вычисляет любые байты. Поэтому, если бы ваша строка имела другую многобайтовую последовательность UTF-8, результаты были бы другими:

strpos("My symbolö utf-8 is the €.", "€") !== mb_strpos("My symbolö utf-8 is the €.", "€", 0, "UTF-8")

но:

strpos("My symbol utf-8 is the €.", "€") === mb_strpos("My symbol utf-8 is the €.", "€", 0, "UTF-8")

в зависимости от используемого набора символов и строки, которую ищут, это может иметь или не иметь значения.

strpos() ищет последовательность байтов, которая передается как игла.

mb_strpos() делает то же самое но он также уважает границы характера.

так strpos() будет соответствовать, если последовательность байтов происходит в любом месте строки. mb_strpos() будет соответствовать, только если последовательность байтов также представляет допустимый набор complete письмена.