问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

解析使用substr截取UTF-8中文字符串出现乱码的问题

发布网友 发布时间:2022-04-28 07:47

我来回答

2个回答

懂视网 时间:2022-04-28 12:09

(推荐教程:php教程)

原因分析:

substr() 函数只针对英文字符,如果我们要分割中文字符,则需要使用 mb_substr()函数。

函数介绍:

mb_substr() 函数返回字符串的一部分。

语法:

mb_substr(string $str, int $start[,int $length = NULL[, string $encoding = mb_internal_encoding()]]):string

参数介绍:

  • str 必需。从该 string 中提取子字符串

  • start 必需。规定在字符串的何处开始

  • length 可选。规定要返回的字符串长度。默认是直到字符串的结尾

  • encoding 可选。字符编码。如果省略,则使用内部字符编码

  • 返回值:

    返回字符串的提取部分,如果失败则返回 FALSE,或者返回一个空字符串。

    代码实现:

    <?php
    header("Content-Type: text/html; charset=utf-8");
    $str="网站工作室欢迎您!";
    echo mb_strlen($str,"UTF8")."<br>";
    echo mb_substr($str,0,2,"UTF8")."<br>";
    ?>

    热心网友 时间:2022-04-28 09:17

    我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案。
    看这样一段代码吧(字符编码为UTF-8):
    复制代码
    代码如下:
    <?
    $str
    =
    '都知道strlen与mb_strlen是求字符串长度的函数';
    echo
    strlen($str)'.<br
    />'.mb_strlen($str,'utf-8');
    ?>
    运行上述代码,返回值如下:
    66
    34
    怎么样?strlen中,中文是三个字节的长度,英文则是一个字节的长度!mb_strlen中,都被计算为一字节的长度!所以,我们有时候用substr来截取UTF-8中文字符串的时候,经常会出现乱码,就是这个原因了!
    下面提供一个截取UTF-8字符串的函数:
    复制代码
    代码如下:
    function
    cutstr($sourcestr,$cutlength){
    $returnstr
    =
    '';
    $i
    =
    0;
    $n
    =
    0;
    $str_length
    =
    strlen($sourcestr);
    $mb_str_length
    =
    mb_strlen($sourcestr,'utf-8');
    while(($n
    <
    $cutlength)
    &&
    ($i
    <=
    $str_length)){
    $temp_str
    =
    substr($sourcestr,$i,1);
    $ascnum
    =
    ord($temp_str);
    if($ascnum
    >=
    224){
    $returnstr
    =
    $returnstr.substr($sourcestr,$i,3);
    $i
    =
    $i
    +
    3;
    $n++;
    }
    elseif($ascnum
    >=
    192){
    $returnstr
    =
    $returnstr.substr($sourcestr,$i,2);
    $i
    =
    $i
    +
    2;
    $n++;
    }
    elseif(($ascnum
    >=
    65)
    &&
    ($ascnum
    <=
    90)){
    $returnstr
    =
    $returnstr.substr($sourcestr,$i,1);
    $i
    =
    $i
    +
    1;
    $n++;
    }
    else{
    $returnstr
    =
    $returnstr.substr($sourcestr,$i,1);
    $i
    =
    $i
    +
    1;
    $n
    =
    $n
    +
    0.5;
    }
    }
    if
    ($mb_str_length
    >
    $cutlength){
    $returnstr
    =
    $returnstr
    .
    "...";
    }
    return
    $returnstr;
    }
    使用例子:
    复制代码
    代码如下:
    <?
    $str
    =
    '有效期最长三个月,超过有效期系统将自动删除本条信息';
    //echo
    strlen($str);
    //echo
    '<hr
    />'.mb_strlen($str,'utf-8');
    echo
    '<hr
    />'.$str;
    echo
    '<hr
    />'.cutstr($str,24);
    ?>
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    关于第一次经典语录 ...三个月后打开包装发现里面零件全部损坏,请问能去超市退换 微单相机哪个品牌好 一首歌在酷狗上查找猪猪非主流歌曲club 沙拉拉就有求歌名 一首英文DJ,歌词是"刷啦啦哩,刷啦啦啦哩"还有歌词听起来好像是:"I wa... sha la la la sha la la lei 是什么歌 男孩起名字大全免费2025年 姓李的男孩起名字大全 ...九月十二(阴历)下午16点 出生 姓李 希望大师给起个好点的名字... 电脑开机提示先激活windows电脑上出现要激活WINDOWS是什么意思_百度知 ... 中国建设银行从邮政储蓄银行提钱会产生多少费用 phpstorm怎么修改php.ini php.ini用记事本打开全是乱码? win 2003 iis里安装PHP java时间戳多少位 服务器其中一个站点打不开php了,html等静态文件可以打开? 我做的php网站在本地可以运行,但上传在服务器上就不能访问了? php网站隔一个小时左右就无法访问,显示的错误是数据库链接错误,重启Apache就好了但是又撑不了多久 我的PHP网站也无法访问,你能帮我看看吗?很急。谢谢 phpstudy 站点设置好了 然后在网页上输入站点 就是显示网页无法访问 php网站访问不了 Window2003服务器上可以访问PHP网站,在电脑上不能访问,是怎么回事? php运行不了结果 网页拒绝访问 安装了PHP服务器,但无法访问本地网页的原因可能会有哪些呢? php简单正则匹配Img标签src内容采集? php 正则怎样匹配img标签的src内容 php获取html标签image的src内容 正则表达式 php+mysql &lt;中文&gt;替换成&lt;img src=&quot;中文.gif&quot;&gt; php preg_replace 如何修改 src属性内容 php 正则替换src里面的内容 php 正则查找 图片的src 并替换相应的src php 截取字符串 怎么最后一位数变成乱码了? php 汉字截取substr出现乱码 同一个PHP文件中用substr_replace函数时出现乱码问题,用str_ireplace函数时正常,究竟问题出在哪儿了 对于php的错误输出,一般来说,在开发过程和生产环境中有什么不同的要求 PHP错误日志的时间与系统时间不一致 php 怎么将json 转成数组对象 你好,你之前的问题“把接受到的json转换成php数组”是怎么解决的,能说一下具体方法吗,谢谢 json 转php array问题!着急!200分! json转换php格式 请教一下,用PHP如何生成50万个不重复的8位阿拉伯数字? php生成三个数字并且任意两个不重复 yum安装php 怎么开启 sockets yum安装的php如何添加模块 PHP 如何过滤特殊字符 如◆ php 如何过滤特殊字符,如◆)- :、、!! / 等 (转)PHP如何去掉转义 php 如何过滤掉xml中的特殊字符 如何将字符串下的数转化为浮点数 C语言怎么能把字符串转化成浮点型数据? 如何将字符串转化成浮点型,且精确度为小数点后12位