`

substr截取中文字符出现乱码的解决方法二则

 
阅读更多
使用fetch_feed()获取rss数据时,利用substr()函数截取200字节作为内容摘要。但是,substr函数在截取字符时是按字节来截取的,中文字符在GB2312编码时为2个字节,utf-8编码时为3个字节,所以截取指定长度的字符串时如果截断了汉字,那么返回的结果显示出来便会出现乱码。iqr 淘宝iqr 淘宝商城iqr 淘宝女装

查了一下,网上大多只提到了使用PHP扩展库方法,即利用mb_substr()代替substr()函数。

方法定义:string mb_substr ( string str, int start [, int length [, string encoding]] )

扩展库位置:php.ini中;extension=php_mbstring.dll,去掉前面的分号。

注意:在使用mb_substr()最后要加入多一个参数,以设定字符串的编码,例如,

1
2
3

使用mb_substr()函数可保证不会出现乱码,但缺点是长度统计变成了字符数统计,而不是按字节数统计。用于显示时,同样长度的中文结果和英文结果会出现较大的显示长度的差别。

另外,中文字符常用编码有utf-8和GB2312,一般情况下mb_substr()不能通用于上述两种编码。

枫芸志给我们提供了另外一个方法,转述如下:

这里提供一个函数可较好地解决substr遇到中文字符的问题。此函数由UCHome 1.5中的getstr()函数修改而来。

中文字符按2个长度单位来计算,使得中英文混用环境下字符串截取结果最后的显示长度接近;舍弃最后一个不完整字符,保证不会出现显示上的乱码;且兼容了中文字符常用的utf-8编码和GB2312编码,有很好的通用性。

function getstr($string, $length, $encoding = ‘utf-8′) {
$string = trim($string);

if($length && strlen($string) > $length) {
//截断字符
$wordscut = ”;
if(strtolower($encoding) == ‘utf-8′) {
//utf8编码
$n = 0;
$tn = 0;
$noc = 0;
while ($n < strlen($string)) {
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 $tn = 1;
$n++;
$noc++;
} elseif(194 $tn = 2;
$n += 2;
$noc += 2;
} elseif(224 $tn = 3;
$n += 3;
$noc += 2;
} elseif(240 $tn = 4;
$n += 4;
$noc += 2;
} elseif(248 = $length) {
break;
}
}
if ($noc > $length) {
$n -= $tn;
}
$wordscut = substr($string, 0, $n);
} else {
for($i = 0; $i < $length – 1; $i++) { if(ord($string[$i]) > 127) {
$wordscut .= $string[$i].$string[$i + 1];
$i++;
} else {
$wordscut .= $string[$i];
}
}
}
$string = $wordscut;
}
return trim($string);
}

// 示例
echo getstr(“0一二三四五六七”,5).’
‘; // 0一二
分享到:
评论

相关推荐

    impala中substr()截取中文字符串乱码的问题

    impala的substr()和substring()函数是不支持中文的,创建一个udf解决impala sql中substr()函数截取中文字符串乱码的问题

    PHP中使用substr()截取字符串出现中文乱码问题该怎么办

    但字符串只要出现中文字符,就有可能导致PHP substr中文乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位数不准确,substr()硬生生地将一个中文字符“锯”成两半,造成断开的字符会...

    PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]

    在PHP中,使substr函数截取字符串末位会出现乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位不准确,造成断开的字符会把其后的..拉过来一起做一个字,所以出现了乱码。

    php 解决substr()截取中文字符乱码问题

    在php中如果我要用substr()截取字符串全英文的没问题,如果包括有中文或英文就会悲剧了,但大家也 别切我们可以使用其它办法来解决。 php截取中文字符串出现乱码,这是最近发现的事情,先前我曾经写过一篇关于自动...

    解析使用substr截取UTF-8中文字符串出现乱码的问题

    本篇文章是对使用substr截取UTF-8中文字符串出现乱码的问题进行了详细的分析介绍,需要的朋友参考下

    PHP截取汉字乱码问题解决方法mb_substr函数的应用

    利用mb_substr截取字符串不会出现乱码问题,高手可以飞过......

    PHP中实现中文字串截取无乱码的解决方法

    直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半。解决办法: 1、使用mbstring扩展库的mb_substr截取就不会出现乱码了。 2、自己书写截取函数,但效率不如用...

    php截取中文字符串不乱码的方法

     //utf-8编码的字符串echo mb_substr($str, 0, 2, ‘utf-8’); //输出 我a[/code 中英混合也完全没有问题。 友情提示 使用的时候要注意php文件的编码,和网页显示时的编码。 使用这个mb_substr方法要事先知道字符串...

    php中文字符串截取方法实例总结

    用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半。 解决办法如下: 1、使用mbstring扩展库的mb_substr截取就不会出现乱码了。 2、自己书写截取函数,但效率不如用...

    php中文字符截取防乱码

    当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空” 根据这一特点,在substr的结果后面补上一个chr(0),就可以...

    php截取utf-8中文字符串乱码的解决方法

    复制代码 代码如下:function utf8_substr($str,$len) { for($i=0;$i&lt;$len;$i++) { $temp_str=substr($str,0,1); if(ord($temp_str) &gt; 127){ $i++; if($i&lt;$len){ $new_str[]=substr($str,0,3); $str=substr($...

    php实现中文字符截取防乱码方法汇总

    直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半。那么我们来看看如何解决这个问题呢。

    PHP字符串的编码问题的详细介绍

     使用substr截取中文字符时会出现乱码,这是因为substr是按字节来截取的。即UTF-8编码的中文,使用substr截取,只会截取1/3个中文,当然出现乱码了。  mb_substr ( string $str , int $start [, int $length [, ...

Global site tag (gtag.js) - Google Analytics