2012-12-17 24 views
6

Tak: Wiem. Powinniśmy użyć funkcji mb_ *, gdy pracujemy z char wielobajtowym. Ale kiedy używamy strpos? rzućmy wyglądać ten kod (zapisany w UTF-8)mb_strpos vs strpos, jaka jest różnica?

var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23) 

istnieje różnica korzystania mb_strpos? Czy ta praca nie jest taka sama? W końcu, strpos szukasz ciąg (wiele bajtów)? Czy jest jakiś powód, aby użyć zamiast tego strpos?

+1

To może pomóc :: http://stackoverflow.com/questions/ 5712226/when-should-i-use-mb-strpos-over-strpos –

Odpowiedz

11

Dla UTF-8 dopasowanie sekwencji bajtów jest dokładnie takie samo jak dopasowanie sekwencji znaków.

Więc oboje znaleźć igłę w dokładnie tym samym momencie, ale mb_strpos liczy pełne UTF-8 sequencees bajt przed igła, gdzie jako strpos oblicza żadnych bajtów. Więc jeśli ciąg miał inny wielo-bajtowy ciąg znaków UTF-8, wyniki byłyby inne:

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

Ale:

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

W zależności od używanego zestawu znaków i poszukiwanego ciągu może to mieć znaczenie lub nie.

strpos() szuka sekwencji bajtów przekazywanych jako igły.

mb_strpos() robi to samo, co , ale również respektuje granice znaków.

Tak strpos() będzie pasować, jeśli sekwencja bajtów wystąpi w dowolnym miejscu ciągu. mb_strpos() będzie pasować tylko wtedy, gdy sekwencja bajtów reprezentuje również poprawny zestaw kompletnych znaków.