2012-12-17 23 views
6

Sì: lo so. Dovremmo usare la funzione mb_ * quando lavoriamo con char multibyte. Ma quando usiamo lo strpos? Diamo uno sguardo questo codice (salvato in UTF-8)mb_strpos vs strpos, qual è la differenza?

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

C'è una differenza di usare mb_strpos? Non fa questo lavoro gli stessi posti di lavoro? Dopo tutto, non è strpos cercare una stringa (più byte)? C'è una ragione per usare invece lo strpos?

+1

Questo potrebbe aiutare :: http://stackoverflow.com/questions/ 5712226/quando-dovrebbe-i-use-MB-strpos-over-strpos –

risposta

11

Per UTF-8, la corrispondenza della sequenza di byte è esattamente la stessa della sequenza di caratteri corrispondente.

Così hanno entrambi saranno trovare l'ago esattamente nello stesso punto, ma mb_strpos conta pieno UTF-8 byte sequencees prima l'ago, dove come strpos calcola ogni byte. Quindi, se la stringa ha avuto un altro multi-byte sequenza UTF-8, i risultati sarebbero diversi:

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

Ma:

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

A seconda del set di caratteri in uso e della stringa cercata, questo può o non può fare la differenza.

strpos() cerca la sequenza di byte che viene passata come l'ago.

mb_strpos() fa la stessa cosa ma rispetta anche i limiti dei caratteri.

Quindi strpos() corrisponderà se la sequenza di byte si verifica in qualsiasi punto della stringa. mb_strpos() corrisponderà solo se la sequenza di byte rappresenta anche un set valido di caratteri completi.