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


Posted in PHP onSeptember 11, 2012

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手册

PHP 相关文章推荐
php的计数器程序
Oct 09 PHP
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
php实现的一个很好用HTML解析器类可用于采集数据
Sep 23 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
Jan 20 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
PHP最常用的正则表达式
Feb 13 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 22 PHP
php接口隔离原则实例分析
Nov 11 PHP
phpstudy2020搭建站点的实现示例
Oct 30 PHP
php中将汉字转换成拼音的函数代码
Sep 08 #PHP
PHP json格式和js json格式 js跨域调用实现代码
Sep 08 #PHP
header跳转和include包含问题详解
Sep 08 #PHP
php比较多维数组中值的大小排序实现代码
Sep 08 #PHP
JSON在PHP中的应用介绍
Sep 08 #PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 #PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 #PHP
You might like
PHP遍历二维数组的代码
2011/04/22 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
Python模块学习 filecmp 文件比较
2012/08/27 Python
20招让你的Python飞起来!
2016/09/27 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
pycharm的python_stubs问题
2020/04/08 Python
python如何处理程序无法打开
2020/06/16 Python
python文件读取失败怎么处理
2020/06/23 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
如何写毕业求职自荐信
2013/11/06 职场文书
工地安全检查制度
2014/02/04 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
党课主持词大全
2015/06/30 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书