PHP多字节字符串处理函数:strlen mb_strlen mb_substr mb_strcut
本文主要介绍:
strlen() mb_strlen() mb_substr() mb_strcut()的使用和区别以及在不使用mb_strlen函数的情况下,如何自定义函数替换mb_strlen函数,实现中英文混合组成的字符串的长度?如何编译安装php程序时支持mbstring函数库?
以上函数默认需要PHP函数库支持:mbstring
1、使用及区别:
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是1~3倍的差异了。
采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,’UTF-8′)。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到,设置有两种方式:
1. 在php.ini中设置mbstring.internal_encoding = UTF-8
2. 调用mb_internal_encoding(“GBK”)
除了mb_strlen,还有很多切割函数,其中mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。而且从函数切割对长度的作用也不同,mb_strcut的切割条件是小于strlen, mb_substr是等于strlen,看下面的例子
- $str = '这是一个中文字符串-https://www.fity.cn';
- echo "mb_substr:" . mb_substr($str, 0, 6, 'utf-8');
- echo "
- ";
- echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8');
- //output
- //mb_substr:这是一个中文 (6个字符)
- //mb_strcut:这是 (6个字符串)
因为在utf8中一个中文字符是三个字节,所以“这是”这个字符串的长度是6,而mb_substr或mb_strlen处理是六个字符。
strlen或mb_strcut是按英文来的,英文字母在任何编码中都是一个字节。所以strlen在含有其他语言文字的时候,计算的其实可以理解为字节数目。而mb_strlen或mb_substr计算的是字符数目。
2、如何使用其他自定义函数取缔或替换mb_strlen..
今天在测试修正程序博客文章页面描述信息截取字符时遇到下图所示问题:
firstheader.php文件中line 21 codes:
if(mb_strlen($newDescription,'UTF-8')>=mb_strlen($config['blogdesc'],'UTF-8')){
错误已经提示的很清楚是缺少函数库对函数mb_strlen的支持(未定义),但是由于所在的服务器虚拟主机空间PHP不支持mbstring函数库,所以只能靠自己想办法解决啦,这里莪是通过自定义了一个函数然后替换了之前的mb_strlen函数,如果你有更好的解决方法可以评论哈,code如下:
- /*---自定义函数mb_cutStr开始,用于取缔line21原mb_strlen字符截取函数---*/
- function mb_cutStr($str, $len)
- {
- $new_str = ' ';
- $wordLen = 0;
- while ($wordLen < $len) {
- $temp_str = substr($str, 0, 1);
- if (ord($temp_str) > 127) { // 中文
- $new_str .= substr($str, 0, 3);
- $str = substr($str, 3);
- $wordLen++;
- } else { // E文
- $new_str .= substr($str, 0, 1);
- $str = substr($str, 1);
- $wordLen++;
- }
- }
- return $new_str;
- }
- /*---自定义函数mb_cutStr结束 Modify by:未来往事 https://www.fity.cn 2012/07/07---*/
3、独立主机php如何支持mbstring函数库
需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php编译模块时加入mbstring的支持:
Windows或Linux系统环境下配置php支持mbstring函数库你可以参考这篇文章:https://www.fity.cn/post/179/
不错不错。路过学习了。