当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP 字符串编码截取函数(兼容utf-8和gb2312)

PHP
PHP Tokenizer 学习笔记
三步搞定phpwind的静态化部署
DEDE5.3把tag标签逗号改成空格的方法分享
实例解析:从IIS的ASP迁移到APACHE的PHP
PHP读取Excel 之 Spreadsheet_Excel_Reader
PHP导出Excel 之 Spreadsheet_Excel_Writer
PDO不推广,PHP得不到发展
勇于创新,激情开拓新的未来
PHPCMS开发文档里看到PHP编码规范
一个模版引擎的诞生 开发者的思考
关于PHP开发框架
开发框架的选择和设计经验谈
框架带给我们什么(浅谈PHP框架对PHP发展的影响)
通过PHP实现DataGrid功能
php curl函数应用方法之模拟浏览器
单汉字转UNICODE
php在线打包/解包
listdir($dir) 目录读取函数
使用Apache的rewrite技术
php正则

PHP 字符串编码截取函数(兼容utf-8和gb2312)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 132 ::
收藏到网摘: n/a

昨天晚上和今天上午看了字符编码的问题,还有一些别人截取字符串的函数,自己也写了一个,兼容utf-8和gb2312的
复制代码 代码如下:

//截取字符串长度。支持utf-8和gb2312编码。若为gb2312,先将其转为utf-8,在utf-8的基础上截取然后再转换回来
function cut_string($str,$from=1,$length=10,$code='utf-8',$rear='...'){
if($code!='utf-8'){//总是将字符串转为utf-8编码
$str=iconv($code,'utf-8',$str);
}
$str_len=mb_strlen($str,'utf-8');//字符串的长度
if($from>$str_len){//如果截取开始位置大于字符串长度,截取后面$length个
$from=$str_len-$length+1;
$from=($from<1?1:$from);
}
//兼容ucs-4编码
$i=0;//字节计数
$from_i=0;//开始截取的字节位置
$from_len=0;//开始截取的字符位置
$tag=true;//标志$from_len是否已经被赋值
for($temp_len=0;($temp_len-$from_len<$length)||$tag;$temp_len++){
$byte_code=ord(substr($str,$i,1));//一个字节的编码
if($temp_len+1==$from){//记录开始截取的开始字节位置
$from_i=$i;$from_len=$temp_len;$tag=false;
}
if($byte_code>=0&&$byte_code<128){//字符是占用几个字节,utf-8是变长编码,根据每个字符的第一个字节可判断出该字符占几个字节
$i++;
}
if($byte_code>191&&$byte_code<224){
$i+=2;
}
if($byte_code>223&&$byte_code<240){
$i+=3;
}
if($byte_code>239&&$byte_code<248){
$i+=4;
}
if($byte_code>248&&$byte_code<252){
$i+=5;
}
if($byte_code>252&&$byte_code<255){
$i+=6;
}
}
return iconv('utf-8',$code,substr($str,$from_i,$i-$from_i).$rear);
}