• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

如何利用php来截取一段中文字符串而不出现乱码

发布: 2007-7-04 20:00 | 作者: admin | 来源:  网友评论 | 查看: 13次 | 进入软件测试论坛讨论

领测软件测试网

作者:jeffwu(327wu@263.net)
[code:1:e818e36f81]
/*
功能:截取全角和半角混合的字符串以避免乱码
参数:
$str_cut 需要截断的字符串
$length  允许字符串显示的最大长度

*/

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

if (strlen($str_cut) > $length){
  for($i=0; $i < $length; $i++)
   if (ord($str_cut[$i]) > 128) $i++;
  $str_cut = substr($str_cut,0,$i) . "...";
}
return $str_cut;
}

[/code:1:e818e36f81]
说明:
程序的关键语句是:
[code:1:e818e36f81]
for($i=0; $i < $length; $i++)
if (ord($str_cut[$i]) > 128) $i++;

$str_cut = substr($str_cut,0,$i) . "...";
[/code:1:e818e36f81]
如果字符的ASCII码大于128,说明当前字符和下一个字符是属于一个汉字的。
则,$i++ 跳过对下一个字符的判断。
再结合循环中的 $i++ ,实际上,当遇到一个汉字时,$i 就会加 2 ,从而正确的跳过汉字。
最终实现的效果是,$i 变量指向的要么是半角的字符,要么是全角汉字的首字符,不会指向
全角汉字的第二个字符,所以,当$i >= $length 时,循环结束,使用
$str_cut = substr($str_cut,0,$i) . "..."; 截取字符时自然也就不会出现乱码了。


本人在写一个程序时需要利用PHP从一段字符串中截取指定长度的一段字符下来。以前在写ASP的时候,参考动网的程序写过类似的程序,不过,还没用PHP写过。

想偷懒,看有不有现成的代码可以用。于是,在GOOGLE中输入:PHP 截断字符 后查找到一段代码。

全文:http://www.yesky.com/SoftChannel/72342371945349120/20020510/1610570_3.shtml

引用:
#########################################################################
  如何分别全角和半角以避免乱码? 

  我们可以写这样一个函数来实现: 
[code:1:e818e36f81]
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; 
}  
[/code:1:e818e36f81]
  这个函数原理就是截断一个字符,看看其ascII码是不是大于128,如果是,说明截断的是一个全角汉字,那么就退后一个截断。用$length控制长度 

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

#######################################################################

消化、测试这段代码后发现有问题。经过反复调试,查找出,这段代码基于的原理不正确。
它认为,汉字的两个字节其ASCII码都会大于128,其实不然,一个汉字的首个字节的ASCII码
必定是大于128的,但是第二个字节的ASCII码不一定大于128,例如:"?",其两个字节的ASCII
码分别为:181 和 118。

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

一点点体会,写出来也是想和大家一起交流、学习。我不知道是不是有人已经写过上面的函数,不过,
我还没能读到,也就只能自己琢磨了,呵呵。

欢迎有兴趣的朋友来信交流。

 

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网