• 技术文章 >后端开发 >php教程

    php中文字符串截取乱码问题解决方法_PHP教程

    2016-07-13 10:57:05原创639

    出现中文截取乱码的问题一般是中文文合混时比较多,如果你截取英文不会有问题,中文就会有,主要原因是:字符串编码为UTF-8的,一个中文字符占三个字节而字符串编码为GB2312的,一个中文字符占两个字节了。下面我来先来看实例。

    字符串编码为GB2312的,一个中文字符占两个字节:

    代码如下 复制代码

    public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
    $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
    for($i = $start; $i < $strlen;) {
    if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
    $tmpstr .= substr ( $str, $i, 2 ); // 每次取出两位字符赋给变量$tmpstr,即等于一个汉字
    $i=$i+2; // 变量自加2
    } else{
    $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
    $i++;
    }
    }
    return $tmpstr; // 返回字符串
    }

    字符串编码为UTF-8的,一个中文字符占三个字节:

    代码如下 复制代码


    public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
    $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
    for($i = $start; $i < $strlen;) {
    if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
    $tmpstr .= substr ( $str, $i, 3 ); // 每次取出三位字符赋给变量$tmpstr,即等于一个汉字
    $i=$i+3; // 变量自加3
    } else{
    $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
    $i++;
    }
    }
    return $tmpstr; // 返回字符串
    }

    上面虽然解决了这个问题,但是要注意编码问题,相对来说比较麻烦,下面写了一个不管什么编码都没问题的解决办法。

    代码如下 复制代码

    /**
    * Utf-8、gb2312都支持的汉字截取函数
    * cut_str(字符串, 截取长度, 开始长度, 编码);
    * 编码默认为 utf-8
    * 开始长度默认为 0
    */
    function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
    {
    if($code == 'UTF-8')
    {
    $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
    preg_match_all($pa, $string, $t_string);
    if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."…";
    return join('', array_slice($t_string[0], $start, $sublen));
    }
    else
    {
    $start = $start*2;
    $sublen = $sublen*2;
    $strlen = strlen($string);
    $tmpstr = '';
    for($i=0; $i< $strlen; $i++)
    {
    if($i>=$start && $i< ($start+$sublen))
    {
    if(ord(substr($string, $i, 1))>129)
    {
    $tmpstr.= substr($string, $i, 2);
    }
    else
    {
    $tmpstr.= substr($string, $i, 1);
    }
    }
    if(ord(substr($string, $i, 1))>129) $i++;
    }
    if(strlen($tmpstr)< $strlen ) $tmpstr.= "…";
    return $tmpstr;
    }
    }

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/632122.htmlTechArticle出现中文截取乱码的问题一般是中文文合混时比较多,如果你截取英文不会有问题,中文就会有,主要原因是:字符串编码为UTF-8的,一个中...

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 中文 字符串 截取 乱码 问题 解决 方法 出现 中文 截取 乱码 问题 一般 文文 混时
    上一篇:php错误提示:Deprecated: Function eregi() is deprecated_PHP教程 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 聊聊ChatGPT是啥?PHP怎么使用ChatGPT?• 一文详解PHP用流方式实现下载文件(附代码示例)• PHP反序列化入门总结(小白必看)• PHP原生类的总结分享• 聊聊PHP escapeshellarg函数使用的中文问题
    1/1

    PHP中文网