PHP函数substr()截取中文字符乱码

本文探讨了PHP中substr()函数在处理多字节字符(如中文)时可能出现的乱码问题,原因是该函数按字节而非字符截取字符串。当编码为GBK/GB2312时,中文占2个字节,UTF-8编码则占3个字节。解决方案是使用mb_substr()函数,它能正确处理多字节字符,但统计长度会按字符计数,可能导致显示长度差异。文章提供了相关代码示例和解决方案。
摘要由CSDN通过智能技术生成

问题描述:

substr()函数在截取字符串时是按字节来截取的,在GBK/GB2312编码下,一个中文占2个字节;UTF-8/unicode编码下,一个中文占3个字节。
<?php
$text = "竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。";
echo $text,"\n"; // 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
echo strlen($text)."\n"; // 57
echo mb_strlen($text),"\n"; // 19
$str1 = substr($text, 11);
echo $str1."\n"; // �轻胜马,谁怕?一蓑烟雨任平生。

原因分析:

substr函数在截取字符时是按字节来截取的,中文字符在GB2312编码时为2个字节,utf-8编码时为3个字节,所以截取指定长度的字符串时如果截断了汉字,那么返回的结果显示出来便会出现乱码。


解决方案:

使用mb_substr()函数可保证不会出现乱码,但缺点是长度统计变成了字符数统计,而不是按字节数统计。用于显示时,同样长度的中文结果和英文结果会出现较大的显示长度的差别。

<?php
$text = "竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。";
echo $text,"\n"; // 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
echo strlen($text)."\n"; // 57
echo mb_strlen($text),"\n"; // 19
$str1 = substr($text, 11);
echo $str1."\n"; // �轻胜马,谁怕?一蓑烟雨任平生。
$str2 = mb_substr($text, 11); // 一蓑烟雨任平生。
echo $str2;

参考文章地址:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值