php朝花夕拾之strlen mb_strlen的函数的区别

涉及到一个字符编码问题

gbk编码:一个汉字占两个字节

utf8编码:一个汉字占3个字节

案例:

<?php
$str="php";
echo strlen($str); //3,
echo "<br/>";
$str="传智播客";
echo "得到的是字节数:".strlen($str); //12
$str="传智播客PHP学院";
echo "<br/>";
echo strlen($str); //21
echo "<br/>";
echo mb_strlen($str,"gbk"); //12 一个汉字是
echo "<br/>";
echo mb_strlen($str,"utf8"); //9
?>

面试题目:

关于汉字字符串的截取:

案例:

<?php
header("Content-Type:text/html;charset=utf8");
$str="我的目标是成为PHP高级系统架构师";
echo mb_substr($str,6,7,"gbk"); //3个字节当成两个汉字 :是成为PHP
echo "<br/>";
echo mb_substr($str,6,7,"utf8"); // 为PHP高级系

function sub_utf8($str ,$start,$length=null){
    ##分割成单个字符串的数组
    $arr=preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY);
    //去除其中的一段
    $sub_arr=array_slice($arr,$start,$length);
    return implode("",$sub_arr); ## join("",$sub_arr);
}
echo "<br/>";
echo mb_substr($str,6,2,"utf8"); //为P
echo mb_substr($str,6,2,"gbk"); //是�
echo "<br/>";
$rs=sub_utf8($str,6,7);
echo "<pre>";
print_r($rs);
echo "</pre>";
?>

案例2:

<?php

//如何求解字符串:中国2北333京的字符串,找到其中的北
header("Content-Type:text/html;charset=utf8");

$str="中国2北333京";

echo mb_strlen($str,"utf8"); //8
echo "<br/>";
echo strlen($str); //16
echo "<br/>";
echo mb_substr($str,3,1,'utf8');

//方法二,使用自定义的函数
function sub_utf8($str,$start=null,$length=null){
    return implode("",array_slice(preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY),$start,$length));
}
$arr=sub_utf8($str,3,1);
echo "<pre>";
print_r($arr);
echo "</pre>";

注意,上个案例中,用自定义的函数计算字符串长度的函数

可以直接

 return count(preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY));

希望对编码有疑问的同学,能够解答你们的疑惑!

转载于:https://my.oschina.net/linuxphp/blog/742818

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值