php去掉最后一个汉字,php substr截断中文半个汉字乱码问题的解决方法

在php中,多使用substr函数截取字符串,但有时会出现半个汉字乱码的问题,此时可以使用mb_substr()函数安全的截取。

substr函数

string substr ( string $string , int $start [, int $length ] )

返回string中从start位置开始长度为length的字符串

substr函数在截取字符时是按字节来截取的,中文字符在GB2312编码时为2个字节,utf-8编码时为3个字节,所以截取指定长度的字符串时如果截断了汉字,那么返回的结果显示出来便会出现乱码。

解决办法:

1、改用mb_substr()函数

string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

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

2、来自康盛的substr功能

中文字符按2个长度单位来计算,使得中英文混用环境下字符串截取结果最后的显示长度接近;

舍弃最后一个不完整字符,保证不会出现显示上的乱码;

且兼容了中文字符常用的utf-8编码和GB2312编码,有很好的通用性。

代码如下:

复制代码 代码示例:

/**

* 改进的substr

* edit www.jbxue.com

*/

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 <= $t && $t <= 126)) {

$tn = 1;

$n++;

$noc++;

} elseif(194 <= $t && $t <= 223) {

$tn = 2;

$n += 2;

$noc += 2;

} elseif(224 <= $t && $t < 239) {

$tn = 3;

$n += 3;

$noc += 2;

} elseif(240 <= $t && $t <= 247) {

$tn = 4;

$n += 4;

$noc += 2;

} elseif(248 <= $t && $t <= 251) {

$tn = 5;

$n += 5;

$noc += 2;

} elseif($t == 252 || $t == 253) {

$tn = 6;

$n += 6;

$noc += 2;

} else {

$n++;

}

if ($noc >= $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);

}

?>

您可能感兴趣的文章:

php函数substr截取中文字符出现乱码的解决方法

php乱码问题 utf8乱码杂谈

php截取中文字符串乱码如何解决呢

php分割GBK中文乱码的解决方法

解决php截取utf-8中文字符串时乱码的问题

如何解决php中文字符乱码,中文字符入库乱码的问题

php中文字符串截断且无乱码的解决方法

有关php中文乱码的解决方法

php utf8 一半乱码的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值