$str ="1234北京北京";
echo strlen($str)."<hr>";
echo mb_strlen($str);返回12 12,换一下$str ="1234北上广深";
echo strlen($str)."<hr>";
echo mb_strlen($str);返回12 9,再换一下$str ="1234樊人樊人";
echo strlen($str)."<hr>";
echo mb_strlen($str);返回12 10
如何解释?编程环境Apache/2.4.16 (Win32) OpenSSL/1.0.1p PHP/5.6.12 

解决方案 »

  1.   

    我这边运行
    strlen = 16
    mb_strlen = 8
      

  2.   

    你到 php.ini 中看一下 mbstring.internal_encoding 的值
    或者用 echo mb_internal_encoding(); 打印一下
    你就会发现至少有一个是 utf-8
    也就是说,你的 mbstring 默认处理的字符集是 utf-8但是你示例的代码是 gbk 的,于是就出现了
    12 12
    12 9
    12 10
    这样的结果即,你把 gbk 编码当做 utf-8 编码处理了。其中不符合 utf-8 编码规则的字节组合被丢弃了
      

  3.   

    供参考:
    strlen — 获取字符串长度
    int strlen ( string $string )
    返回给定的字符串 string 的长度。mb_strlen
    int mb_strlen ( string $str [, string $encoding ] )
    返回给定的字符串 string 的长度。
    encoding参数为字符编码。如果省略,则使用内部字符编码。在strlen计算时,对待一个UTF8的中文字符是3个长度,例如“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,如“中文a字1符”长度是6 .