是的:我知道。在使用多字节字符时,我们应该使用mb_*函数。但当我们使用strpos的时候?让我们看看这段代码(保存在utf-8中)
var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23)使用mb_strpos有区别吗?难道这不是同样的工作吗?毕竟,strpos不需要一个字符串(多字节)吗?是否有理由使用而不是strpos?
发布于 2012-12-17 12:04:31
对于UTF-8,匹配字节序列与匹配字符序列完全相同.
因此,他们都会在完全相同的点上找到针头,但是mb_strpos在之前对UTF-8字节序列进行计数,strpos计算任何字节。因此,如果您的字符串有另一个多字节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")发布于 2020-09-25 22:17:24
我不认为上面的例子完全透明,有些用户可能会感到困惑。
mb_string()应该用于多字节编码,以及您在其他问题(如here )中解释的多字节编码是什么。
最近我们在这个例子中主要使用UTF编码作为UTF-8 (也是UTF-16),它是多字节字符集,但是通常我们只使用strpos字符集(例如英语),并且strpos和mb_strpos的结果是相同的。
当我们使用多字节字符,即汉字时,这种区别是显而易见的。
echo mb_internal_encoding(); //UTF-8
echo strpos('我在买绿茶', '在'); //3
echo mb_strpos('我在买绿茶', '在'); //1因此,显然它适用于汉字,但也适用于一些人不知道的。
为了更广泛地了解它是如何工作的,我用strlen()和mb_strlen()函数显示以下字符串的长度。
echo strlen('我在买绿茶'); //15
echo mb_strlen('我在买绿茶'); //5https://stackoverflow.com/questions/13913411
复制相似问题