PHP中strsub字符串长度不足,php 判断字符串长度 strlen() 与 mb_strlen() 函数用法与不同环境下的测试...

博客详细探讨了PHP 5.2和7.3版本中mb_strlen()与strlen()函数在处理中文字符时的差异,特别是在不同编码环境(UTF-8、GBK、GB2312)下的表现。内容指出PHP低版本需确保文件编码和函数参数一致,而高版本默认支持UTF-8,无需额外配置。还给出了相关测试案例和结论,建议使用高版本PHP并默认使用mb_strlen()处理字符串长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2020-09-27 更新

在代码中使用 mb_strlen($str) 和 mb_substr($str, 1) 隐藏用户名,服务器端(php 5.2)执行出现了乱码。针对服务端 php 脚本文件做了以下补充测试:

服务器环境:windows server 2008 R2 Enterprise,64x,php5.2.17,php 脚本,文件编码 utf-8。echo strlen('中国'),'
';

echo mb_strlen('中国'),'
';

echo mb_strlen('中国','utf-8'),'
';

echo mb_strlen('中国','gb2312'),'
';

echo mb_strlen('中国','gbk'),'
';

#输出结果

6

6

2

4

3

本地环境:win7,64x,php7.3.2,php 脚本,文件编码 utf-8。echo strlen('中国'),'
';

echo mb_strlen('中国'),'
';

echo mb_strlen('中国','utf-8'),'
';

echo mb_strlen('中国','gb2312'),'
';

echo mb_strlen('中国','gbk'),'
';

#输出结果

6

2

2

4

3

所以,php 低版本(5.2)需要确保本文件编码和函数参数都为 utf-8,这样结果是可信的。高版本结果本身就是可信的,不需要额外配置参数。#php 低版本 mb_* 函数样例

mb_strlen($str, 'utf-8');

mb_substr($str, 1, $len-1, 'utf-8');

相同点(联系)

strlen() 与 mb_strlen() 都是属于判断字符串长度的函数。从名称上也可以看出来,后者是对前者扩展。

区别

strlen() 对于英文字符计算正确,但对于中文字符,如:“中国”,结果变成了 6,即一个中文字符占用 3 个长度。猜测函数内部根据表示字符编码的字节数来计算长度的。对于纯中文情况下,可以通过结果除以 3 来修正预期的结果,但如果是中英文混合,或者还参杂其他类型的语言的字符串,就很难去计算预期长度了。

而 mb_strlen() 在计算时,若选定内码为 UTF8,则会将一个 UTF8 编码的中文字符当作长度 1 来计算,所以长度满足预期。

strlen() 为核心函数,可以直接调用,而 mb_strlen() 为扩展功能函数,需要在 php.ini 取消对 extension=php_mbstring.dll 的注释,引入 mbstring 扩展模块后才能使用。php -m 查看当前已加载的模块。

mb_strlen() 执行速度要比 strlen() 慢好几倍。

mb_strlen 扩展

适用范围 (PHP 4 >= 4.0.6, PHP 5, PHP 7)

mb_strlen() 函数的第一个参数为目标字符串,第二个参数为字符编码。如果省略,则使用内部字符编码,默认为 UTF8。附:如何查看内部字符编码。

mb_strlen() 测试php -r "echo mb_strlen('中国');"

本地环境: win7,64x,php7.3.2,git-bash,内部字符为 zh_CN.UTF-8。$ php -r "echo strlen('中国');"

6

$ php -r "echo mb_strlen('中国');"

2

$ php -r "echo mb_strlen('中国','utf-8');"

2

$ php -r "echo mb_strlen('中国','gb2312');"

4

$ php -r "echo mb_strlen('中国','gbk');"

3

本地环境: win7,64x,php7.3.2,cmd,内部字符为 936 中国 - 简体中文(GB2312)。C:\Users\Administrator>php -r "echo strlen('中国');"

6

C:\Users\Administrator>php -r "echo mb_strlen('中国');"

2

C:\Users\Administrator>php -r "echo mb_strlen('中国','utf-8');"

2

C:\Users\Administrator>php -r "echo mb_strlen('中国','gbk2312');"

4

C:\Users\Administrator>php -r "echo mb_strlen('中国','gbk');"

3

服务器环境:windows server 2008 R2 Enterprise,64x,php5.2.17,git-bash,内部字符为 zh_CN.UTF-8。$ php -r "echo strlen('中国');"

4

$ php -r "echo mb_strlen('中国');"

4

$ php -r "echo mb_strlen('中国','utf-8');"

3

$ php -r "echo mb_strlen('中国','gb2312');"

2

$ php -r "echo mb_strlen('中国','gbk');"

2

服务器环境:windows server 2008 R2 Enterprise,64x,php5.2.17,cmd,内部字符为 936 中国 - 简体中文(GB2312)。C:\Users\Administrator>php -r "echo strlen('中国');"

4

C:\Users\Administrator>php -r "echo mb_strlen('中国');"

4

C:\Users\Administrator>php -r "echo mb_strlen('中国','utf-8');"

3

C:\Users\Administrator>php -r "echo mb_strlen('中国','gb2312');"

2

C:\Users\Administrator>php -r "echo mb_strlen('中国','gbk');"

2

初步结论:相同环境下,虽然内部字符(字符编码)不一致,但相同语句输出的结果相同。php7 下默认字符编码就是 utf-8,而php5.2 下不清楚默认编码。php7 下同为中文编码,gb2312 与 gbk 编码的长度不相同。而在 php5.2 下表现一致。

建议使用高版本的 php,且在不确定目标字符串编码类型时,第二参数缺省即可。

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值