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

2015-01-24信息快讯网

今天需要用一个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手册
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
通过PHP current函数获取未知字符键名数组第一个元素的值
PHP随机字符串生成代码(包括大小写字母)
使用php统计字符串中中英文字符的个数
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
解析php获取字符串的编码格式的方法(函数)
解析php安全性问题中的:Null 字符问题
解析使用substr截取UTF-8中文字符串出现乱码的问题
php常用Output和ptions/Info函数集介绍
使用array mutisort 实现按某字段对数据排序
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
php实现utf-8和GB2312编码相互转换函数代码
php验证手机号码(支持归属地查询及编码为UTF8)
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
PHP中几种常见的超时处理全面总结
php中将汉字转换成拼音的函数代码
比较discuz和ecshop的截取字符串函数php版
php中3种方法统计字符串中每种字符的个数并排序
php中计算未知长度的字符串哪个字符出现的次数最多的代码
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
php中数组首字符过滤功能代码
php中jQuery插件autocomplate的简单使用笔记
PHP乱码问题,UTF-8乱码常见问题小结
PHP __autoload()方法真的影响性能吗?
php _autoload自动加载类与机制分析
PHP __autoload函数(自动载入类文件)的使用方法
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
php smarty截取中文字符乱码问题?gb2312/utf-8
PHP通过iconv将字符串从GBK转换为UTF8字符集
PHP字符编码问题之GB2312 VS UTF-8解决方法
©2014-2024 dbsqp.com