首页 > php开发 > php中文字符串截取乱码问题解决方法

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

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

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

<?php
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的,一个中文字符占三个字节,代码如下:

<?php
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; // 返回字符串
    
}
?>

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

<?php
/** 
 * 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)) . "&hellip;";
        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.= "&hellip;";
        return $tmpstr;
    }
}
?>

               
               

本文地址:http://www.phprm.com/develop/fs744.html

转载随意,但请附上文章地址:-)

标签:中文 截取 乱码 字符串

相关文章

发表留言