首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mb_strpos和strpos有什么区别?

mb_strpos和strpos有什么区别?
EN

Stack Overflow用户
提问于 2012-12-17 11:37:12
回答 2查看 12.5K关注 0票数 12

是的:我知道。在使用多字节字符时,我们应该使用mb_*函数。但当我们使用strpos的时候?让我们看看这段代码(保存在utf-8中)

代码语言:javascript
复制
var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23)

使用mb_strpos有区别吗?难道这不是同样的工作吗?毕竟,strpos不需要一个字符串(多字节)吗?是否有理由使用而不是strpos?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-17 12:04:31

对于UTF-8,匹配字节序列与匹配字符序列完全相同.

因此,他们都会在完全相同的点上找到针头,但是mb_strpos之前对UTF-8字节序列进行计数,strpos计算任何字节。因此,如果您的字符串有另一个多字节UTF-8序列,结果将是不同的:

代码语言:javascript
复制
strpos("My symbolö utf-8 is the €.", "€") !== mb_strpos("My symbolö utf-8 is the €.", "€", 0, "UTF-8")

但是:

代码语言:javascript
复制
strpos("My symbol utf-8 is the €.", "€") === mb_strpos("My symbol utf-8 is the €.", "€", 0, "UTF-8")
票数 17
EN

Stack Overflow用户

发布于 2020-09-25 22:17:24

我不认为上面的例子完全透明,有些用户可能会感到困惑。

mb_string()应该用于多字节编码,以及您在其他问题(如here )中解释的多字节编码是什么。

最近我们在这个例子中主要使用UTF编码作为UTF-8 (也是UTF-16),它是多字节字符集,但是通常我们只使用strpos字符集(例如英语),并且strposmb_strpos的结果是相同的。

当我们使用多字节字符,即汉字时,这种区别是显而易见的。

代码语言:javascript
复制
echo mb_internal_encoding(); //UTF-8

echo strpos('我在买绿茶', '在'); //3

echo mb_strpos('我在买绿茶', '在'); //1

因此,显然它适用于汉字,但也适用于一些人不知道的。

为了更广泛地了解它是如何工作的,我用strlen()mb_strlen()函数显示以下字符串的长度。

代码语言:javascript
复制
echo strlen('我在买绿茶'); //15

echo mb_strlen('我在买绿茶'); //5
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13913411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档