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 相关文章推荐
Discuz! Passport 通行证整合
Mar 27 PHP
PHP 裁剪图片成固定大小代码方法
Sep 09 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
Apr 25 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
PHP+Ajax+JS实现多图上传
May 07 PHP
PHP中new static()与new self()的比较
Aug 19 PHP
谈谈php对接芝麻信用踩的坑
Dec 01 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 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 Xdebug的安装与使用详解
2013/06/20 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
js实现星星打分效果
2020/07/05 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
python中快速进行多个字符替换的方法小结
2016/12/15 Python
Python 常用的安装Module方式汇总
2017/05/06 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
python plotly画柱状图代码实例
2019/12/13 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
裁员通知
2015/04/25 职场文书