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]
[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]
相关文章推荐
- PHP正则匹配汉字(UTF-8和GBK两种编码)
- PHP中不同编码的汉字占的字节数不同gbk,GBK,UTF-8,utf-8
- 各种编码方式详解,ASCII、ISO-8859-1、GB2312、GBK、UTF-16、UTF-8等
- 字符的编码方式 ASCII 、GBK 、UTF-8 、Unicode 、Unicode big endian
- Yii框架针对gbk编码的修改,CHtml可用,兼容php5.4
- PHP删除字符串中的中文的正则表达式兼容gbk/gb2312/utf-8
- PHP截取字符串编码(兼容utf-8和gb2312)
- 使用jquery以jsonp方式在gbk页面请求utf-8编码的数据
- PHP中转换编码问题 GBK/UTF-8等
- PHP 字符串编码截取函数(兼容utf-8和gb2312)
- php导入到excel-支持utf8和gbk两种编码 格式防乱码
- PHP 字符串编码截取函数(兼容utf-8和gb2312)
- JavaScript PHP 通过URLEncode字串判断其编码是UTF-8还是GBK
- NUICODE UTF-8 GBK 等编码方式来龙去脉
- 中文乱码问题 ? 原因:JSP中默认使用iso-8859-1字符编码方式,不支持中文 ? 常见的支持中文的编码方式:gb2312(常用简体汉字)、gbk(简体和繁体汉字)、utf-8 ? 解决中文乱码
- php检测字符串编码(utf-8,gbk,gb2312)是否为utf8编码的方法总结
- PHP中的GBK与UTF-8等字符串编码形式的自由转换工具iconv
- 数据库选择编码方式(GBK、UTF-8)
- php的header来定义一个php页面为utf编码或GBK编码
- PHP转换编码问题GBK/UTF-8