解析使用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