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

PHP
PHP实现网页自动更新块
PHP 5.0 中的对象重载技术研究
轻型数据库SQLite结合PHP的开发
PHP中模板分页的处理
在debian下为PHP5.0.3安装pdo模块
PHP下实现端口复用/劫持
PHP链接ACCESS数据库最简单的方法
IIS 不用 rewrite 实现页面静态化的方法
PHP发现安全漏洞
Windows下PHP4.0与Oracle 8的连接设置
使用OOP技术来优化PHP应用程序
用MySQL和PHP创建XML
正则表达式中的特殊字符一览
截获网站
在UNIX平台上的Netscape Enterprise Server 3.x下配置PHP
Windows 98下安装Apache(PWS) PHP4MySQLphpMyAdmin的方法
对《Windows 9x/NT下以Apache的模块方式安装PHP4》的补充
Windows2000下安装Apache PHP4 MySQL
在WIN98下安装PHP4+ PERSONAL ORACLE8I
在 PHP 中用描点法“绘制”中文

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 296 ::
收藏到网摘: 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);
}