PHP中strlen和mb_strlen函数的区别

在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别…
先看例子:

<?php
 
$str='中文a字1符';
 
echo strlen($str).'<br>';//14
 
echo mb_strlen($str,'utf8').'<br>';//6
 
echo mb_strlen($str,'gbk').'<br>';//8
 
echo mb_strlen($str,'gb2312').'<br>';//10
>

分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 .

利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)

echo (strlen($str) + mb_strlen($str,'UTF8')) / 2;

例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.

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

补充:

里面代码如下(代码编码为UTF-8):

<?php

$str1 = 'www.111cn.net';

$str2 = '烟雨网';

$str3 = '烟雨网111cn.net';

echo mb_strlen($str1).'<br>';//结果15

echo mb_strlen($str2).'<br>';//结果6

echo mb_strlen($str3).'<br>';//结果17

echo '--------1-------------<br>';

echo strlen($str1).'<br>';//结果15

echo strlen($str2).'<br>';//结果6

echo strlen($str3).'<br>';//结果17

echo '--------utf-8-------------<br>';

echo mb_strlen($str1,'utf-8').'<br>';//结果15

echo mb_strlen($str2,'utf-8').'<br>';//结果3

echo mb_strlen($str3,'utf-8').'<br>';//结果14

echo '--------gbk-------------<br>';

echo mb_strlen($str1,'gbk').'<br>';//结果15

echo mb_strlen($str2,'gbk').'<br>';//结果5

echo mb_strlen($str3,'gbk').'<br>';//结果15

echo '--------gb2312-------------<br>';

echo mb_strlen($str1,'gb2312').'<br>';//结果15

echo mb_strlen($str2,'gb2312').'<br>';//结果5

echo mb_strlen($str3,'gb2312').'<br>';//结果16

?>

至此现在只得出两点结论:

1. 当为英文字母时,strlen和mb_strlen可以通用,编码不同,两个函数结果都是一样。

2. 当为中文时候,编码会影响字符的长度,就算是中文对于GBK和GB2312都是不同的表现。

3. 代码编码为UTF-8,否则得出的结果现象会和我的有出入,当为其他编码时候,比如为ANSI时结果值会为另外的值,而且需要注意的是,mb_strlen并不是PHP核心函数,需要加载扩展,代码结果如下:

(代码编码为ANSI)

<?php

$str1 = 'www.111cn.net';

$str2 = '烟雨网';

$str3 = '烟雨网111cn.net';

echo mb_strlen($str1).'<br>';//结果15

echo mb_strlen($str2).'<br>';//结果6

echo mb_strlen($str3).'<br>';//结果17

echo '--------1-------------<br>';

echo strlen($str1).'<br>';//结果15

echo strlen($str2).'<br>';//结果6

echo strlen($str3).'<br>';//结果17

echo '--------utf-8-------------<br>';

echo mb_strlen($str1,'utf-8').'<br>';//结果15

echo mb_strlen($str2,'utf-8').'<br>';//结果3

echo mb_strlen($str3,'utf-8').'<br>';//结果14

echo '--------gbk-------------<br>';

echo mb_strlen($str1,'gbk').'<br>';//结果15

echo mb_strlen($str2,'gbk').'<br>';//结果3

echo mb_strlen($str3,'gbk').'<br>';//结果14

echo '--------gb2312-------------<br>';

echo mb_strlen($str1,'gb2312').'<br>';//结果15

echo mb_strlen($str2,'gb2312').'<br>';//结果3

echo mb_strlen($str3,'gb2312').'<br>';//结果14

?>

另外,对于各个编码对字符长度的影响规律还在测试中,我把我的测试结果发在这里,欢迎知道的朋友告诉我,谢谢!

时间: 2024-09-10 12:47:03

PHP中strlen和mb_strlen函数的区别的相关文章

详解PHP中strlen和mb_strlen函数的区别_php实例

在PHP里有两个计算字符串个数的函数一个是 strlen,一个是mb_strlen;先来看看手册中的定义strlenstrlen - 获取字符串长度int strlen ( string $string )返回给定的字符串 string 的长度. mb_strlenint mb_strlen ( string $str [, string $encoding ] )返回给定的字符串 string 的长度.encoding参数为字符编码.如果省略,则使用内部字符编码. 这么看除了mb_strlen

细说PHP中strlen和mb_strlen的区别

原文:细说PHP中strlen和mb_strlen的区别 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别.下面通过例子,讲解这两者之间的区别. $str='中文a字1符'; echo strlen($str);//字节个数 ,14 echo mb_strlen($str,'UTF-8');//选定内码为UTF-8,中文作为一个字节,6 echo mb_strlen($str,'gbk'); //8 echo mb_s

php中strlen和mb_strlen用法实例分析_php技巧

本文实例分析了php中strlen和mb_strlen用法.分享给大家供大家参考,具体如下: 首先看如下代码(文件编码utf8): <?php $utf8_string = "abcd我你他她它"; var_dump(strlen($utf8_string)); var_dump(mb_strlen($utf8_string, 'gb2312')); var_dump(mb_strlen($utf8_string, 'utf8')); var_dump(mb_strlen($ut

php中sprintf与printf函数用法区别

 这篇文章主要介绍了php中sprintf与printf函数用法区别解析,需要的朋友可以参考下 下面是一个示例:四舍五入保留小数点后两位    代码如下: <?php $num1 = 21; echo sprintf("%0.2f",$num1)."<br />"; //输出 21.00 $num2 = 16.3287; echo sprintf("%0.2f",$num2)."<br />";

浅析PHP中strlen和mb_strlen的区别_php实例

在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别. 下面通过例子,讲解这两者之间的区别. 先看例子: <?php //测试时文件的编码方式要是UTF8 $str='中文a字1符'; echo strlen($str).'<br>';//14 echo mb_strlen($str,'utf8').'<br>';//6 echo mb_strlen($str,'gbk').'<br>';/

PHP中strlen()和mb_strlen()的区别浅析_php实例

在php中常见的计算字符串长度的函数有:strlen和mb_strlen.当字符全是英文字符的时候,两者是一样.这里主要比较一下,中英文混排的时候,两个计算结果. 先来看一个例子: 复制代码 代码如下: <?php  //测试时文件的编码方式要是UTF8  $str='中文a字1符';  echo strlen($str).'<br>';//14  echo mb_strlen($str,'utf8').'<br>';//6  echo mb_strlen($str,'gbk

C/C++中mem和strcopy函数的区别和应用

mem系列函数是面试的时候常考的知识点,我们需要熟练掌握这三个函数的原理和代码实现,要能准确无误的写出代码. memcpy.memset和memset三个函数在使用过程中,均需包含以下头文件: //在C中 #include<string.h> //在C++中 #include<cstring> memcpy memcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,拷贝n个字节到目标dst所指的内存地址的起始位置中. 研究函数功能最好的办法就是

JavaScript中各种编码解码函数的区别和注意事项_javascript技巧

大家在使用JS提交数据时,尤其是中文的时候,经常会需要将要提交的字符串进行URL编码.在JS中对字符串进行URL编码有好几种方 法,encodeURI,encodeURIComponent,还有escape.在我看到的很多代码中escape这个函数用的最多,不过这个函数却 是不推荐使用的.下面我们来分别看看这几个函数: encodeURI:对指定的字符串进行URL编码,不包括 : # / \ = & 这些URL中的关键字符. encodeURIComponent:对字符串中的字符进行编码,包括U

php中explode与split函数的区别

首先来看下两个方法的定义: 函数原型:array split (string $pattern, string $string [, int $limit]) 函数原型:array explode ( string $separator, string $string [, int $limit]) 初看没有啥差别,貌似功能都一样.我就犯了这个错误. 请注意两个函数的第一个参数string $pattern和string separator,一个是$pattern说明是正则字符串,一个是$sep