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学院
?>
|