当前位置: 首页 > 图文教程 > 网络编程 > PHP > 如何利用php来截取一段中文字符串而不出现乱码

PHP
工作笔记:配置MySQL为高可用集群 (1)
MySQL (C API)VC实例及代码下载 (1)(5)
MySQL (C API)VC实例及代码下载 (1)(4)
MySQL (C API)VC实例及代码下载 (1)(3)
MySQL (C API)VC实例及代码下载 (1)(2)
MySQL (C API)VC实例及代码下载 (1)
用JSP连接mysql数据库的方法 (1)(2)
用JSP连接mysql数据库的方法 (1)
MySQL数据库账户授权的相关管理解析 (1)(2)
MySQL数据库账户授权的相关管理解析 (1)
SAP MaxDB MySQL修补数据库严重漏洞
MySQL研发中心成立发布会会后访问整理 (1)(2)
MySQL研发中心成立发布会会后访问整理 (1)
MySQL中SQL-TEXT、DATE和SET数据类型
MySQL存在权限提升及安全限制绕过漏洞
MySQL 卸载的问题
windows下安装、卸载mysql服务
如何正确卸载MySQL
MySQL手册版本 5.0.20-MySQL优化(四) (1)(5)
MySQL手册版本 5.0.20-MySQL优化(四) (1)(4)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 106 ::
收藏到网摘: n/a

作者:jeffwu([email protected])
[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。

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

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

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