PHP实现中文字符串的长度计算和截取无乱码

在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点。

但是有些新手朋友们可能遇到过,当待截取的字符串出现中英文混合时,计算字符串的长度,会出现不准确和截取出现乱码的情况,其实这个也是非常容易解决的。

首先,要了解关于中英文占多少字节的问题。

ASCII码:一个中文汉字占两个字节的空间。

UTF-8编码:一个中文(含繁体)等于三个字节。

Unicode编码:一个中文(含繁体)等于两个字节。

其次,如果是需要计算字符串的长度,需要明确是“字符”的长度还是“字节”的长度。

例如,是不是中英文数字符号等1个都算1个,还是按实际占用的字节计算。
这个需要看具体的使用场景,需要存储导数据时,需要按字节计算实际的长度,和数据库字段的长度匹配。需要前端显示时,可能需要按字符计算。

第三,实际处理用到的两个函数mb_substr()mb_strlen()

mb_substr($str,$start,$len,$encoding),用于中文字符串的截取,在相应的编码页面输入相应的$encoding

mb_strlen($str,$encodding),用于获取中文字符串的长度,包含多字节的字符算成一个。

GBK编码截取示例

$str = '我是谁';  //gbk编码的字符串
echo mb_substr($str, 0, 1, 'gbk'); //输出 我

utf-8编码截取示例

$str = '我abc是谁';  //utf-8编码的字符串
echo mb_substr($str, 0, 2, 'utf-8'); //输出 我a

中英混合也完全没有问题。

【但是,一定要住编码需要明确指定,否则可能还是会出现乱码】

第四,关于mb_strcut按字节来切分字符串,截取中文都不会产生半个字符的现象

substrmb_substrmb_strcut这三个函数都用来截取字符串,所不同的是:

substr是最简单的截取,无法适应中文;

mb_substr是按字来切分字符串,

mb_strcut是按字节来切分字符串,截取中文都不会产生半个字符的现象。

这三个函数的前三个参数完全一致,即:

第一个参数是操作对象

第二个参数是截取的起始位置

第三个参数是截取的数量

mb_substrmb_strcut还有第四个参数:第四个参数可以根据不同的字符集进行设置。

友情提示

使用的时候要注意php文件的编码,和网页显示时的编码。

使用这两个mb_substrmb_strcut方法要事先知道字符串的编码,如果不知道编码,就需要判,mbstring库还提供了mb_check_encoding来检验字符串编码,但还不完善。

mb_check_encoding($str,$encoding);成功是返回true,失败时返回false;

php中文字符串的截取 其中ord($str)>127(因为中文字符的acsii码的范围是128(即0x80-0xfe)-254)