A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

php实现中文字符串截取无乱码的方法

首先我们需要知道:
  • 中文字符在gbk编码下占2个字节,在utf-8编码下占3个字节
  • php的ord() 函数返回字符串第一个字符的 ASCII 值
  • 中文字符的ASCII值是大于0xa0
  • 关键的点是判断要截取的字符串是中文字符还是英文字符,用ord(substr($str,$start,1))>0xa0可判断,大于则是中文,否则是英文
  • 实现代码如下:

[PHP] 纯文本查看 复制代码
<?php
header('Content-type:text/html;charset=utf-8');
/*
 *param $str 要截取的字符串。
 *param $start 从第几个开始截取,0为第一个。
 *param $length 要截取的个数,默认为空,则从$start开始截取到最后一个。
 *param $bite 中文字符的字节长度,默认是gbk编码,填写为2,如果是utf-8编码,则填写为3.
 */
function my_substr($str, $start, $length = "", $bite = 2) {
    $pos = 0; //用来计算在字符串截取的字节位置
    //下面这段for循环用来计算在字符串开始截取的位置
    for ($i = 0; $i < $start; $i++) {
        if (ord(substr($str, $i, 1)) > 0xa0) {
            $pos += $bite; //如果是中文字符,则位置加上中文字符长度;
        } else {
            $pos += 1;
        }
    }

    //开始截取
    if ($length == "") {
        return substr($str, $pos); //如果$length为空,则从开始截取到最后一个
    } else {
        if ($length < 0) {
            $length = 0;
        }
        $string = "";
        for ($i = 0; $i < $length; $i++) {//判断字符串中的每个字符是中文还是英文
            if (ord(substr($str, $pos, 1)) > 0xa0) { //如果是中文字符,
                $string .= substr($str, $pos, $bite); //就要根据中文字符长度来截取
                $pos += $bite;
            } else {//如果是英文字符
                $string .= substr($str, $pos, 1);
                $pos += 1;
            }
        }
        return $string;
    }
}

$str = "传智播客itcast-php学院";
echo my_substr($str, 0); //从第一个开始输出到最后一个,输出 传智播客itcast-php学院 
echo '<hr/>';

echo my_substr($str, 0,4,3); //输出传智播客
echo '<hr/>';

echo my_substr($str, 11); //输出php学院

?>

  • 效果如图



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马