PHP UTF8中文字符截断函数代码

 更新时间:2012年09月11日 01:43:49   作者:  
今天需要用一个UTF-8的字符串截断函数,网上找了几个代码片段发现都有问题,于是查了一下原理自己写了一个函数,代码片段如下

php中英文混合字符截断不乱码函数(utf8)

复制代码 代码如下:

//utf8格式下的中文字符截断
//$sourcestr 是要处理的字符串
//$cutlength 为截取的长度(即字数)
//$addstr 超过长度时在尾处加上的字符
function cut_str($sourcestr, $cutlength, $addstr='...'){
 $returnstr='';
 $i=0;
 $n=0;
 $str_length=strlen($sourcestr);//字符串的字节数
 while (($n<$cutlength) and ($i<=$str_length)){
  $temp_str=substr($sourcestr,$i,1);
  $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
  if ($ascnum>=224){ //如果ASCII位高与224,
   $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
   $i=$i+3; //实际Byte计为3
   $n++; //字串长度计1
  }elseif ($ascnum>=192){ //如果ASCII位高与192,
   $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
   $i=$i+2; //实际Byte计为2
   $n++; //字串长度计1
  }elseif ($ascnum>=65 && $ascnum<=90){ //如果是大写字母,
   $returnstr=$returnstr.substr($sourcestr,$i,1);
   $i=$i+1; //实际的Byte数仍计1个
   $n++; //但考虑整体美观,大写字母计成一个高位字符
  }else{ //其他情况下,包括小写字母和半角标点符号,
   $returnstr=$returnstr.substr($sourcestr,$i,1);
   $i=$i+1; //实际的Byte数计1个
   $n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
  }
 }
 if ($str_length>$cutlength){
  $returnstr = $returnstr . $addstr;//超过长度时在尾处加上的字符
 }
 return $returnstr;
}



复制代码 代码如下:

<?php
/* UTF-8中文字符截断程序 */
$str = "123这是测试字符串";
$str1 = "()()";
echo subUTF8str($str,0,3)."<br>";
echo subUTF8str($str,0,4)."<br>";
echo subUTF8str($str1,0,4)."<br>";
echo subUTF8str($str1,0,10)."<br>";
function subUTF8str($str,$start=0,$length=80){
$cur_len = 0; //人理解的字符串长度
$all_len = strlen($str); //机器理解字符串长度
if($length > $all_len)
{
return $str;
}
for($i = 0;$i < $all_len;)
{
if($cur_len == $start)
{
break;
}
if (ord($str[$i]) > 127)
{
$i += 3;
}else{
$i += 1;
}
$cur_len ++;
}
$start_pos = $i;
$temp_pos = $cur_len;
for(;$cur_len - $temp_pos < $length;)
{
if($i >= $all_len)
break;
if (ord($str[$i]) > 127)
{
$i += 3;
}else{
$i += 1;
}
$cur_len ++;
}
$end_pos = $i;
return substr($str,$start_pos,$end_pos);
}
?>

其实,PHP原生就有多charset下字符截取方案,额,所以就是这个样子...囧..
Multibyte String Functions函数族中,

string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] ) 用来字符串截取
int mb_strlen ( string $str [, string $encoding ] ) 返回字符串长度
....
详细请查看PHP手册

相关文章

  • thinkphp3.2点击刷新生成验证码

    thinkphp3.2点击刷新生成验证码

    这篇文章主要介绍了thinkphp3.2点击刷新生成验证码的相关资料,需要的朋友可以参考下
    2016-02-02
  • PHP生成UTF8文件的方法

    PHP生成UTF8文件的方法

    先用函数utf8_encode将所需写入的数据变成UTF编码格式。
    2010-05-05
  • php实现简易聊天室应用代码

    php实现简易聊天室应用代码

    聊天应用程序在网上非常常见,开发人员在构建这类应用程序时的选择也很多。这篇文章介绍了如何实现基于PHP-AJAX的聊天应用程序,并且不需要刷新页面就可以发送和接收消息,需要的朋友可以参考下
    2015-09-09
  • 浅谈php7的重大新特性

    浅谈php7的重大新特性

    PHP7将在2015年10月正式发布,PHP7 ,将会是PHP脚本语言的重大版本更新,同时将带来大幅的性能改进和新的特性,以及改进一些过时功能。 该 发布版本将会专注在性能加强,源自PHP版本树中的phpng分支。
    2015-10-10
  • php使用vue实现省市区三级联动

    php使用vue实现省市区三级联动

    这篇文章主要为大家详细介绍了php如何使用vue实现省市区三级联动效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • PHP微信模板消息操作示例

    PHP微信模板消息操作示例

    这篇文章主要介绍了PHP微信模板消息操作方法,结合实例形式分析了php模板消息的定义与调用方法,需要的朋友可以参考下
    2017-06-06
  • php中mysql连接方式PDO使用详解

    php中mysql连接方式PDO使用详解

    本文主要详细介绍了PHP中mysql的连接方式PDO的各种使用方法,算是个人的一个小结,如有遗漏还请告之,有需要的小伙伴来参考下吧。
    2015-02-02
  • 高质量PHP代码的50个实用技巧必备(下)

    高质量PHP代码的50个实用技巧必备(下)

    这篇文章主要为大家分享了50个高质量PHP代码的实用技巧,大家必备的php实用代码,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • smarty 原来也不过如此~~呵呵

    smarty 原来也不过如此~~呵呵

    smarty 原来也不过如此~~呵呵...
    2006-11-11
  • PHP字符串的递增和递减示例介绍

    PHP字符串的递增和递减示例介绍

    这篇文章主要介绍了PHP中字符串的递增和递减,需要的朋友可以参考下
    2014-02-02

最新评论