PHP中strlen和mb_strlen函数的区别

 更新时间:2016年11月25日 16:45  点击:2121
strlen和mb_strlen函数在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

?>

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

如果我们要取数据中随机的值出来我们可以使用遍历随机当然这样是不好的,我们可以使用array_rand函数来直接随机取了,具体的如下所示。

定义和用法

array_rand() 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组。

说明

array_rand() 函数从数组中随机选出一个或多个元素,并返回。
第二个参数用来确定要选出几个元素。如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名。

array_rand() 在你想从数组中取出一个或多个随机的单元时相当有用。它接受 input 作为输入数组和一个可选的参数 num_req,指明了你想取出多少个单元 - 如果没有指定,默认为 1。如果你只取出一个,array_rand() 返回一个随机单元的键名,否则就返回一个包含随机键名的数组。这样你就可以随机从数组中取出键名和值。   

如下例所示:

<?php

$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
print $input[$rand_keys[0]] . "\n";
print $input[$rand_keys[1]] . "\n";

输出:

Trinity

Cypher
 
 
【注意】
当 num_req 为 1 时,返回非数组数据,而当 num_req >=2 时,返回数组数据,所以,如果取的数量不确定是否为 1 的情况下,建议如下方式统一转换为数组:

$num_req = max(1, $num_req);
$num_req = min($num_req, count($input));
$rand_keys = (array)array_rand($input, $num_req);

组随机抽取shuffle()和array_rand()

随机抽取就是将原有数组的元素打乱后输出,这意味着每次执行后,抽取的顺序或元素都不同,该功能可以用来在网页上每次显示不同的广告用shuffle()函数实现数组的随机抽取:

<?php
    $textArray = array('1','2','3','4','5','6','7');
    shuffle($textArray);
    print_r($textArray);
?>

结果如下显示:
Array ( [0] => 6 [1] => 3 [2] => 7 [3] => 4 [4] => 1 [5] => 2 [6] => 5 )
实现的数组元素的随机排序;
另外php还提供了从数组中随机抽取值的函数:array_rand() ,其调用格式如下:
array_rand(<数组>,[抽取元素的个数]);

<?php
    $arry = array('A','B','C','D');
    $result = array_rand($arry,2);
    foreach ($result as $val) {
    echo $arry["$val"].""; }
?>

结果显示如下:
B
C
刷新有不同的结果;

method_exists函数小编以前用到得今天看一个同事做mvc开发单入口时发现有method_exists函数了,后来网上看了一下method_exists函数功能与例子及自己的体验,下面来为各位分享一下。

method_exists

(PHP 4, PHP 5, PHP 7)

method_exists — 检查类的方法是否存在

说明

bool method_exists ( mixed $object , string $method_name )

如果 method_name 所指的方法在 object 所指的对象类中已定义,则返回 TRUE,否则返回 FALSE。

 代码如下 复制代码

class a {
public function xx(){
echo ‘xx’;
}

public function yy() {
echo ‘yy’;
}
}

$obj = new a();

var_dump(method_exists($obj, ‘xx’));
var_dump(method_exists($obj, ‘xx’));
var_dump(method_exists($obj, ‘xx’));

测试结果都为true

class a {
public function xx(){
echo ‘xx’;
}

public function yy() {
echo ‘yy’;
}

public function yy() {
echo ‘yy’;
}
}

$obj = new a();
$obj->yy();
$obj->yy();

以上语句报错。

例子

 代码如下 复制代码

// 获取要运行的action
include($c_path);

// 加载controller文件
$controller = new $c_name($query);

if ( isset($_GET['m']) ) {
 $method = $_GET['m'];
 
 if ( method_exists($controller, $method) ) {
$controller->$method();
 }
} else {
 // 执行首函数
 $controller->index();
}

json中文乱码问题是一个比较大的问题在处理时要经过复杂的编码判断才可以解决这个问题,不过现在php5.4已经有一个解决方案了,它就是本文章要介绍的JSON_UNESCAPED_UNICODE的使用方法,具体的我们一起来看看吧。

php使用json_encode中文会被编码,开发人员真的恼怒了,如果你用php 5.4版本可以避免这个问题:

<?php

//这样的不好之处是添加了传输数据的数量
echo json_encode('PHP点点通');  //"PHP\u70b9\u70b9\u901a"
 
//如果你用PHP 5.4,那么恭喜你,json可以便面unicode编码
echo json_encode('PHP点点通', JSON_UNESCAPED_UNICODE);

更高级点的例子

if (version_compare(PHP_VERSION, '5.4.0', '<')) {
    $json = json_encode($data);
    $json = preg_replace_callback("#\\\u([0-9a-f]{4})#i", function ($matches) {
        return iconv('UCS-2BE', 'UTF-8', pack('H4', $matches[1]));
    }, $json);
    if ('' != $callback) {
        echo $callback . '(' . $json . ");\n";
    } else {
        echo $json . "\n";
    }
} else {
    $json = json_encode($data, JSON_UNESCAPED_UNICODE);
}

总得来讲例子一与例子二我们如果不确定自己的php版本可以使用例子二来进行判断php版本,根据不同版本给出不同的解决程序。

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • 谈谈Jquery中的children find 的区别有哪些

    精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21