[php]在UTF-8下截取字符串出现乱码的解决方法

本文介绍了一种在未加载mbstring扩展的PHP环境中,如何通过自定义函数实现UTF-8编码下中文字符的正确截取,避免乱码问题。

一个UTF-8中文字符由3个ASCII字符组成,而PHP中对字符的处理是基于ASCII字符的,也就是说,如果在PHP中截取字符串就有可能出现乱码

如果可以加载php的mbstring扩展模块,那么可以用mb_substr()函数解决这个问题,可惜有很多空间并没加载,那么怎么办呢?

那么也只能从UTF-8的特性入手,自己写一个函数了

中文的utf8编码是有规律的,一个中文字符的utf8编码, 总是以224-239之间的ASCII码开头的

那么只要判断截取的字符串后2位的ASCII在不在224-239之间就行了,如果后2位的值都不在,那么就没乱码的问题了,如果其中一个值在这之间,那么把它和它后面的舍弃就行了

function csubstr($string,$index,$length){
  if(strlen($string)<=$length){return substr($string,$index);}
  $char=ord($string[$index+$length-1]);
  if($char>=224&&$char<=239){$length=$length-1;}
  else{
    $char=ord($string[$index+$length-2]);
    if($char>=224&&$char<=239){$length=$length-2;}
  }
  return substr($string,$index,$length).'……';
}

  

 

 

 

转载于:https://www.cnblogs.com/alumiss/archive/2012/11/04/2754265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值