PHP中文字符串截断无乱码解决方法
php  /  管理员 发布于 7年前   215
一个比较好用的字符串截取函数: 使用方法示例: 结果显示: 28 这个函数十分有用,比如用来截断比较长的文件名,但是要在中间加上...,可以这样来做: 另外,网上看到一种超级简单的中文截断解决方案,试用了一下,效果也不错: echo substr($str1,0,10).chr(0); 原理解释: chr(0)不是null ---------------------------- 20120705更新: 以上方法虽好,但是偶尔还是会碰到乱码,原因未深究。不过可以用以下的方法,对UTF8字符文本屡试不爽。 字符串截断函数: 使用方法和之前介绍的一样,比如formatName可以实现如下(这对汉字长度做了小优化): 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。function substring($str, $start, $length){ //比较好用字符串截取函数 $len = $length; if($length < 0){ $str = strrev($str); $len = -$length; } $len= ($len < strlen($str)) ? $len : strlen($str); $tmpstr = ""; for ($i= $start; $i < $len; $i ++) { if (ord(substr($str, $i, 1)) > 0xa0) { $tmpstr .= substr($str, $i, 2); $i++; } else { $tmpstr .= substr($str, $i, 1); } } if($length < 0) $tmpstr = strrev($tmpstr); return $tmpstr;}
$str1 = '我是一串比较长的中文不带英文';$str2 = '我是一串比较长的中文带yingwen';$len = strlen($str1);echo '
'.$len; //return 28$len = strlen($str2);echo '
'.$len; //return 29echo '
'; echo substring($str1, 0, 11); echo '
';echo substring($str2, 0, 11); echo '
';echo substring($str1, 16, 28); echo '
';echo substring($str2, 16, 29);
29
我是一串比较
我是一串比较
中文不带英文
中文带yingwenfunction formatName($str, $size){ $len = strlen($str); if(strlen($str) > $size) { $part1 = substring($str, 0, $size / 2); $part2 = substring($str, $len - ($size/2), $len); return $part1 . "..." . $part2; } else { return $str; }}
07null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000
08虽然chr(0)不会显示出什么,但是他是一个字符。
09当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空”
10根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了
注意:该方法中将汉字计算为1单位长度,英文一个字母1单位长度,所以截断时需要注意长度设置。
计算长度的方法:function strlen_UTF8($str){ $len = strlen($str); $n = 0; for($i = 0; $i < $len; $i++) { $x = substr($str, $i, 1); $a = base_convert(ord($x), 10, 2); $a = substr('00000000'.$a, -8); if (substr($a, 0, 1) == 0) { }elseif (substr($a, 0, 3) == 110) { $i += 1; }elseif (substr($a, 0, 4) == 1110) { $i += 2; } $n++; } return $n;} // End strlen_UTF8;
function subString_UTF8($str, $start, $lenth) { $len = strlen($str); $r = array(); $n = 0; $m = 0; for($i = 0; $i < $len; $i++) { $x = substr($str, $i, 1); $a = base_convert(ord($x), 10, 2); $a = substr('00000000'.$a, -8); if ($n < $start){ if (substr($a, 0, 1) == 0) { }elseif (substr($a, 0, 3) == 110) { $i += 1; }elseif (substr($a, 0, 4) == 1110) { $i += 2; } $n++; }else{ if (substr($a, 0, 1) == 0) { $r[ ] = substr($str, $i, 1); }elseif (substr($a, 0, 3) == 110) { $r[ ] = substr($str, $i, 2); $i += 1; }elseif (substr($a, 0, 4) == 1110) { $r[ ] = substr($str, $i, 3); $i += 2; }else{ $r[ ] = ''; } if (++$m >= $lenth){ break; } } } return join($r); } // End subString_UTF8;
function formatName($str, $size){ $len = strlen_UTF8($str); $one_len = strlen($str); $size = $size * 1.5 * $len / ($one_len); if(strlen_UTF8($str) > $size) { $part1 = subString_UTF8($str, 0, $size / 2); $part2 = subString_UTF8($str, $len - ($size/2), $len); return $part1 . "..." . $part2; } else { return $str; }}
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号