是的我知道.当我们使用multibyte char时,我们应该使用mb_*函数.但是当我们使用strpos时?我们来看看这段代码(保存在utf-8中)
var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23)
Run Code Online (Sandbox Code Playgroud)
使用mb_strpos有区别吗?是不是让这项工作成绩相同?毕竟,不是strpos寻找一个字符串(多个字节)?是否有理由使用strpos?
Esa*_*ija 13
对于UTF-8,匹配字节序列与匹配字符序列完全相同.
因此,他们都会在完全相同的点找到针,但在针之前mb_strpos计算完整的UTF-8字节序列,其中计算任何字节.因此,如果您的字符串具有另一个多字节UTF-8序列,则结果会有所不同:strpos
strpos("My symbolö utf-8 is the €.", "€") !== mb_strpos("My symbolö utf-8 is the €.", "€", 0, "UTF-8")
Run Code Online (Sandbox Code Playgroud)
但:
strpos("My symbol utf-8 is the €.", "€") === mb_strpos("My symbol utf-8 is the €.", "€", 0, "UTF-8")
Run Code Online (Sandbox Code Playgroud)
根据使用的字符集和搜索的字符串,这可能会有所不同,也可能没有区别.
strpos() 查找作为指针传递的字节序列.
mb_strpos()做同样的事情,但它也尊重字符边界.
因此,strpos()如果字节序列出现在字符串中的任何位置,则匹配.mb_strpos()只有在字节序列也代表一组有效的完整字符时才会匹配.
我发现上面的示例并不完全透明,有些用户可能会感到困惑。
\nmb_string()应该用于多字节编码,以及您在其他问题中解释过的什么是多字节编码,例如here。
最近我们主要使用 UTF 编码,如UTF-8本例(也UTF-16)所示,它是多字节字符集,但通常我们只使用 ASCII 字符集(例如英语),并且 和 的结果strpos对于mb_strpos它们来说是相同的。
当我们使用多字节字符(即汉字)时,差异就很明显。
\necho mb_internal_encoding(); //UTF-8\n\necho strpos(\'\xe6\x88\x91\xe5\x9c\xa8\xe4\xb9\xb0\xe7\xbb\xbf\xe8\x8c\xb6\', \'\xe5\x9c\xa8\'); //3\n\necho mb_strpos(\'\xe6\x88\x91\xe5\x9c\xa8\xe4\xb9\xb0\xe7\xbb\xbf\xe8\x8c\xb6\', \'\xe5\x9c\xa8\'); //1\nRun Code Online (Sandbox Code Playgroud)\n显然它适用于汉字,也适用于一些人不知道的表情符号。
\nstrlen()为了更广泛地了解它是如何工作的,我用和函数显示了以下字符串的长度mb_strlen()。
echo strlen(\'\xe6\x88\x91\xe5\x9c\xa8\xe4\xb9\xb0\xe7\xbb\xbf\xe8\x8c\xb6\'); //15\n\necho mb_strlen(\'\xe6\x88\x91\xe5\x9c\xa8\xe4\xb9\xb0\xe7\xbb\xbf\xe8\x8c\xb6\'); //5\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
7951 次 |
| 最近记录: |