For UTF-8, matching a sequence of bytes exactly matches a matching sequence of characters.
This way they both find the needle exactly at the same point, but mb_strpos counts the complete UTF-8 byte sequences to the needle, where strpos calculates any bytes. Therefore, if your line contains another multi-byte UTF-8 sequence, the results will be different:
strpos("My symbolö utf-8 is the €.", "€") !== mb_strpos("My symbolö utf-8 is the €.", "€", 0, "UTF-8")
But:
strpos("My symbol utf-8 is the €.", "€") === mb_strpos("My symbol utf-8 is the €.", "€", 0, "UTF-8")
source share