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 письмена.