美文网首页
PHP中 trim 会导致乱码的原因

PHP中 trim 会导致乱码的原因

作者: 上善丨若水 | 来源:发表于2021-12-14 09:25 被阅读0次

    运行以下代码

    $tag = "互联网产品、";
    $text = rtrim($tag, "、");
    print_r($text);
    

    我们可能以为会得到的结果是互联网产品,实际结果是互联网产�。为什么会这样呢?

    原理

    trim 函数文档

    string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )
    

    该函数不是多字节函数,也就是说,汉字这样的多字节字符,会拿其头或尾的单字节来和后面的$character_mask对应的char数组进行匹配,如果在后面的数组中,则删掉,继续匹配。比如:

    echo ltrim("bcdf","abc");  // df
    

    如下面的 demo 中的函数string_print_char所示:
    0xe3 0x80 0x81三字节组成,
    0xe5 0x93 0x81三字节组成。
    所以在执行rtrim的时候,通过字节比对,会将0x81去掉,导致了最后出现了乱码。

    解决方案

    封装方法:
    public static function mb_rtrim($string, $trim, $encoding)
    {
        $mask = [];
        $trimLength = mb_strlen($trim, $encoding);
        for ($i = 0; $i < $trimLength; $i++) {
            $item = mb_substr($trim, $i, 1, $encoding);
            $mask[] = $item;
        }
    
        $len = mb_strlen($string, $encoding);
        if ($len > 0) {
            $i = $len - 1;
            do {
                $item = mb_substr($string, $i, 1, $encoding);
                if (in_array($item, $mask)) {
                    $len--;
                } else {
                    break;
                }
            } while ($i-- != 0);
        }
    
        return mb_substr($string, 0, $len, $encoding);
    }
    
    mb_internal_encoding("UTF-8");
    $tag = "互联网产品、";
    $encoding = mb_internal_encoding();
    print_r(mb_rtrim($tag, "、",$encoding));
    

    参考文档:
    https://www.php.cn/php-weizijiaocheng-380613.html

    相关文章

      网友评论

          本文标题:PHP中 trim 会导致乱码的原因

          本文链接:https://www.haomeiwen.com/subject/qejefrtx.html