2012-12-17 18 views
6

是的:我知道。我們應該在使用多字節字符時使用mb_ *函數。但是當我們使用strpos? 讓我們來看看這個代碼(保存在UTF-8)mb_strpos vs strpos,有什麼區別?

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

有使用mb_strpos的區別嗎?不會讓這項工作成爲同樣的工作?畢竟,沒有strpos尋找一個字符串(多字節)?是否有理由使用strpos?

+1

這可能有助於:: http://stackoverflow.com/questions/ 5712226 /時,應-I-使用-MB-strpos環比st​​rpos –

回答

11

對於UTF-8,匹配字節序列與匹配字符序列完全相同。

所以他們都將找到針頭在完全相同的點,而是針,其中作爲strpos計算任何字節計數mb_strpos全UTF-8字節sequencees 之前。所以,如果你的字符串有另外的多字節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") 
5

根據使用的字符集和正在搜索的字符串,這可能會也可能不會有所作爲。

strpos()尋找作爲針傳遞的字節序列。

mb_strpos()做同樣的事情它也尊重字符邊界。

因此,如果字節序列出現在字符串中的任何位置,那麼strpos()將匹配。 mb_strpos()只有在字節序列也表示一組有效的完整字符時纔會匹配。

相關問題