php中文字符取无乱码,php程序无乱码截取中文字符串

在我们做项目过程中经常会要用到字符串截取功能,主要是因为数据库长度引起与页面文字显示引起,如果字符串过长,保存入库的时候则会造成保存失败,而页面显示时文字过长则会造成页面排版混乱不好看,那么,我们应该怎么解决这些问题呢,下面我给大家介绍一种方法来实现字符串的截取功能。

/*

功能:截取全角和半角混合的字符串以避免乱码

参数: $str_cut 需要截断的字符串

$length 允许字符串显示的最大长度

*/

function substr_cut($str_cut,$length = 30){

if (strlen($str_cut) > $length){

for($i=0; $i 128) $i++;

$str_cut = substr($str_cut,0,$i) . “…”;

}

return $str_cut;

}

这个程序的关键语句是:

for($i=0; $i 128) $i++;

$str_cut = substr($str_cut,0,$i) . “…”;

如果字符的ASCII码大于128,说明当前字符和下一个字符是属于一个汉字的。

则,$i++ 跳过对下一个字符的判断。

再结合循环中的 $i++ ,实际上,当遇到一个汉字时,$i 就会加 2 ,从而正确的跳过汉字。

最终实现的效果是,$i 变量指向的要么是半角的字符,要么是全角汉字的首字符,不会指向

全角汉字的第二个字符,所以,当$i >= $length 时,循环结束,使用

$str_cut = substr($str_cut,0,$i) . “…”; 截取字符时自然也就不会出现乱码了。

本人在写一个程序时需要利用PHP从一段字符串中截取指定长度的一段字符下来。

引用:

如何分别全角和半角以避免乱码?

我们可以写这样一个函数来实现:

function ChgTitle($title)

{

$length = 46; //我们允许字符串显示的最大长度

if (strlen($title)>$length) {

$temp = 0;

for($i=0; $i<$length; $i++)

if (ord($title[$i]) > 128) $temp++;

if ($temp%2 == 0)

$title = substr($title,0,$length).”…”;

else

$title = substr($title,0,$length+1).”…”;

}

return $title;

}

这个函数原理就是截断一个字符,看看其ascII码是不是大于128,如果是,说明截断的是一个全角汉字,那么就退后一个截断。用$length控制长度

备注:循环判断字符串里面的 >128 的字符个数,如果半角字符为偶数,则表示位置刚好为整个汉字,如果为奇数,则为半个汉字,需要取下一个字符

消化、测试这段代码后发现有问题。经过反复调试,查找出,这段代码基于的原理不正确。

它认为,汉字的两个字节其ASCII码都会大于128,其实不然,一个汉字的首个字节的ASCII码

必定是大于128的,但是第二个字节的ASCII码不一定大于128,例如:”?”,其两个字节的ASCII

码分别为:181 和 118。

经过仔细分析,最终,我利用上面的函数实现了对全角和半角字符串的截取。

以上代码即可实现字符串无乱码截取。一点点体会,写出来也是想和大家一起交流、学习。我不知道是不是有人已经写过上面的函数,不过,我还没能读到,也就只能自己琢磨了,呵呵~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值