`

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()`可能会遇到一些挑战,尤其是在截取中文字符串时可能出现乱码问题。这是因为这两个函数在设计时可能没有充分考虑多字节字符集,如UTF-8,而...

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

    如果我们按照`strlen()`的长度来截取字符串,就很可能会截到中文字符中间,从而出现乱码。 为了正确地截取UTF-8编码的字符串,我们需要采用一个考虑到字符实际占用字节长度的截取方法。文章中提供了一个名为`cutstr...

    解决php截取中文出现乱码

    这主要是因为PHP中的`substr()`函数默认是按字节来截取字符串的,而UTF-8编码下的中文字符通常由多个字节组成(通常是3个字节),如果直接使用默认方式截取,就会导致中文乱码问题。 ### 解决方案 为了解决这个...

    delphi 实现截取字符串中中文+英文混合截取

    由于Unicode编码的存在,中文字符通常占据两个字节,而英文字符则占据一个字节,这就导致了在不正确处理的情况下可能会截断字符,从而出现乱码问题。本篇文章将深入探讨如何在Delphi中实现中文和英文混合字符串的...

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

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

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

    这是因为`substr()`函数默认按照字节来截取字符串,而中文字符通常由多个字节(例如UTF-8编码下为3个字节)组成。因此,简单地按字节截取可能会破坏中文字符的完整性,从而产生乱码。 要解决这个问题,我们需要使用...

    PHP中如何截取中文字符串

    因此,简单的基于字节的截取方法可能会导致截取到的中文字符不完整,从而显示乱码。 1. **使用mbstring扩展** PHP提供了一个强大的多字节字符串处理扩展——mbstring。它支持多种字符编码,包括UTF-8。我们可以...

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

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

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

    PHP 提供了多种方式来处理这种情况,以确保截取的中文字符串不会出现乱码。本篇文章将详细探讨如何在 PHP 中使用 `mb_substr` 函数来正确截取包含中文字符的字符串,并确保它们的可读性。 `mb_substr` 是 PHP 中的...

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

    在PHP开发过程中,遇到汉字截取时经常会出现乱码问题,这是因为PHP的默认字符串处理函数如`substr`在处理多字节字符(如汉字)时可能会导致错误的字符分割。为了解决这个问题,我们可以使用`mb_substr`函数,它是专...

    字符串按照指定的字节数来截取

    了解这些方法后,我们就可以灵活地根据需求截取字符串中的特定字节数部分了。但要注意,字节截取可能会涉及到字符编码问题,因此在实际操作时要特别留意编码格式,避免出现乱码或者截取不完整的情况。

    关于java按字节截取带有汉字的字符串的解法

    这就意味着当我们按照字节长度截取字符串时,可能会将一个完整的汉字分割成两部分,从而导致乱码。 Java中的`String`类提供了多种截取字符串的方法,如`substring()`、`subSequence()`等,但它们都是基于字符(char...

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

    然而,当涉及到包含中文字符的字符串时,`substr()`函数可能会引发乱码问题,这主要是由于中文字符在不同编码(如UTF-8和GB2312)中占用的字节数不同导致的。在UTF-8编码中,每个中文字符占用3个字节,而英文字符则...

    smarty truncate中文乱码解决

    Smarty是一款广泛使用的PHP模板引擎,它允许开发者将HTML和PHP...通过以上方法,你应该能够成功解决Smarty中`truncate`处理中文字符串时的乱码问题。在实际开发中,对字符编码的理解和正确使用是避免此类问题的关键。

    js substr支持中文截取函数代码(中文是双字节)

    首先,JavaScript内置的substr方法用于截取字符串,但它并不直接支持中文字符长度的计算,因为它假定每个字符占用的字节数是相同的。这就需要我们编写一个能够正确计算中文字节长度的函数,比如上面示例中的getChars...

Global site tag (gtag.js) - Google Analytics