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)) . "…";
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;
}
}
?>
本文地址:http://www.phprm.com/develop/fs744.html
转载随意,但请附上文章地址:-)