您的位置:首页 > 编程语言 > PHP开发

PHP兼容utf-8和gbk两种编码方式剪切函数

2012-04-14 13:19 561 查看
[align=left]<?php[/align]
[align=left]/**[/align]
[align=left] * 实现utf-8与gbk中文无乱码截取,提示中文占用‘2’个字符,英文占用‘1’个字符[/align]
* @param sting
$string 待截取字符串
* @param int
$length 截取字符长度,注意截取是字符长度,不是截取‘中文个数’或者‘英文个数’
* @param string
$charset 编码方式,只能为‘uft-8与gbk’,默认为‘utf-8’
* @param string
$dot 分割符,默认为‘...’
* @return string
已截取的目标字符串
[align=left] */[/align]
function cutstr($string, $length,
$charset = 'utf-8' , $dot = '...') //字符,截取长度,字符集,结尾符
[align=left]{[/align]
if(strlen($string)
<= $length) return $string;
[align=left] $pre = chr(1);[/align]
[align=left] $end = chr(1);[/align]
[align=left] [/align]
[align=left] //保护特殊字符串[/align]
$string = str_replace( array('&' , '"' , '<' , '>' ), array($pre
. '&' . $end, $pre . '"' .
$end, $pre . '<' . $end, $pre . '>' .
$end), $string);
[align=left] $strcut = '' ;[/align]
if(strtolower($charset)
== 'utf-8')
[align=left] {[/align]
[align=left] $n = $tn = $noc = 0;[/align]
while($n
< strlen($string))
[align=left] {[/align]
[align=left] $t = ord($string[$n]);[/align]
if($t
== 9 || $t == 10 || (32 <= $t && $t <= 126))
[align=left] {[/align]
[align=left] $tn = 1;[/align]
[align=left] $n++;[/align]
[align=left] $noc++;[/align]
[align=left] }[/align]
elseif(194
<= $t && $t <= 223)
[align=left] {[/align]
[align=left] $tn = 2;[/align]
[align=left] $n += 2;[/align]
[align=left] $noc += 2;[/align]
[align=left] }[/align]
elseif(224
<= $t && $t <= 239)
[align=left] {[/align]
[align=left] $tn = 3;[/align]
[align=left] $n += 3;[/align]
[align=left] $noc += 2;[/align]
[align=left] }[/align]
elseif(240
<= $t && $t <= 247)
[align=left] {[/align]
[align=left] $tn = 4;[/align]
[align=left] $n += 4;[/align]
[align=left] $noc += 2;[/align]
[align=left] }[/align]
elseif(248
<= $t && $t <= 251)
[align=left] {[/align]
[align=left] $tn = 5;[/align]
[align=left] $n += 5;[/align]
[align=left] $noc += 2;[/align]
[align=left] }[/align]
elseif($t
== 252 || $t == 253)
[align=left] {[/align]
[align=left] $tn = 6;[/align]
[align=left] $n += 6;[/align]
[align=left] $noc += 2;[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] $n++;[/align]
[align=left] }[/align]
if($noc
>= $length) break;
[align=left] }[/align]
if($noc
> $length) $n -= $tn;
[align=left] $strcut = substr($string, 0, $n);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
for($i
= 0; $i < $length; $i++)
$strcut .= ord($string[$i]) > 127 ? $string[$i]
. $string[++$i] : $string[$i];
[align=left] }[/align]
[align=left] [/align]
[align=left] //还原特殊字符串[/align]
$strcut = str_replace(array($pre
. '&' . $end, $pre . '"' .
$end, $pre . '<' . $end, $pre . '>' .
$end), array( '&', '"' , '<' , '>'), $strcut);
[align=left] [/align]
[align=left] //修复出现特殊字符串截段的问题[/align]
[align=left] $pos = strrpos($s, chr(1));[/align]
if($pos
!== false) $strcut =
substr( $s, 0, $pos);

return $strcut .
$dot;
[align=left]}[/align]

[align=left]/**[/align]
[align=left] * 测试数据[/align]
[align=left] */[/align]
[align=left]header("Content-type:text/html; charset=utf-8");[/align]
[align=left]$str = "我爱中华1213我爱中华人民共和国" ;[/align]
echo cutstr($str, 6) . '<br
/>' ; //注意截取是字符长度,不是截取‘中文个数’或者‘英文个数’
echo cutstr($str, 10) . '<br
/>' ;
echo cutstr($str, 14) . '<br
/>' ;
[align=left]?>[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: