PHP 字符串长度计算函数strlen() 正确的计算 中文汉字长度的方法 与mb_strlen()应用

摘要:
PHP的内置字符串长度函数strlen()无法正确处理中文字符串。让我们假设我们的编码方法是UTF-8$encode='UTF-8'$I++){if(ord(mb_substr($a,“.$str_num;显然是错误的。如果必须使用strlen和substr函数来计算字符串中的中文字符数,则使用mb_strlen函数可以更好地解决这个问题。

也许很多phper不知道,PHP内置的字符串长度函数strlen()无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。

所以当需要计算字符串中汉字的个数,或者一个字符串的长度,就不是简单的用strlen()能解决了,我们需要曲线救国了,下面我写个简单的代码举例说明:

我们假设我们的编码方式是UTF-8

$encode = 'UTF-8';

$str = "admin你好";

$str_num = mb_strlen($a, $encode);

$j = 0;

for($i=0; $i < $str_num; $i++) 
{
    if(ord(mb_substr($a, $i, 1, $encode))> 0xa0) 
    { 
        $j++;
    }

echo  “这个字符串的长度是:" . $str_num; 
echo   "有".$j. "个汉字 "; 

结果:

这个字符串的长度是:7

有2个汉字

若简单的用strlen函数,这个字符串的长度将显示为:11,显然是错误的

 

若一定要用strlen和substr函数来计算字串中汉字的个数,也是有办法的:

for($i=0;$i < strlen($a);$i++) 
{
    if(ord(substr($a, $i, 1))> 0xa0) 
    { 
        $j++;
        $i++;
        $i++;            //utf-8编码下,跳过两个字节;gb2312,则跳过一个字节即可
    }
}

 

mb_strlen()简介:

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到。需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。

免责声明:文章转载自《PHP 字符串长度计算函数strlen() 正确的计算 中文汉字长度的方法 与mb_strlen()应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇操作系统--内存管理iOS自动化环境搭建——macaca下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【字符串入门专题1】C

Problem Description Generally speaking, there are a lot of problems about strings processing. Now you encounter another such problem. If you get two strings, such as “asdf” and...

整理了几种字符串截取方法

一、 (Substring);(Remove);(Replace) 1、取字符串的前i个字符 (1)string str1=str.Substring(0,i); (2)string str1=str.Remove(i,str.Length-i); 2、去掉字符串的前i个字符 string str1=str.Remove(0,i); string st...

Linux shell脚本中shift的用法说明【转】

本文转载自:http://blog.csdn.net/zhu_xun/article/details/24796235 Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)。   示例1:依次读取输入的参数...

Docker 安装 Tomcat

Docker 安装 Tomcat 方法一、docker pull tomcat 查找 Docker Hub 上的 tomcat 镜像: docker search tomcat 这里我们拉取官方最新版本的 tomcat 镜像: docker pull tomcat 等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 tomcat...

Web service 超过了最大请求长度

Web service的默认的请求长度是4M 当内容超过了4M会报错 System.Web.Services.Protocols.SoapException: 运行配置文件中指定的扩展时出现异常。 ---> System.Web.HttpException: 超过了最大请求长度。 在 System.Web.HttpRequest.GetEnti...

easyui改写datetimebox实现年和月切换

话不多少,直接将代码贴上(直接做成控件了,复制成comboTime.js即可) /* 分析周期与时间组合控件---- 有分析周期下拉框:"options": "data: [{ text: '月', value: 'm', limit: 0 }, { text: '季', value: 'q', limit: 2 }, { text: '年', valu...