PHP 字符串編碼截取函數(shù)(兼容utf-8和gb2312)
更新時間:2009年05月02日 01:27:24 作者:
昨天晚上和今天上午看了字符編碼的問題,還有一些別人截取字符串的函數(shù),自己也寫了一個,兼容utf-8和gb2312的
復(fù)制代碼 代碼如下:
//截取字符串長度。支持utf-8和gb2312編碼。若為gb2312,先將其轉(zhuǎn)為utf-8,在utf-8的基礎(chǔ)上截取然后再轉(zhuǎn)換回來
function cut_string($str,$from=1,$length=10,$code='utf-8',$rear='...'){
if($code!='utf-8'){//總是將字符串轉(zhuǎn)為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;//字節(jié)計數(shù)
$from_i=0;//開始截取的字節(jié)位置
$from_len=0;//開始截取的字符位置
$tag=true;//標(biāo)志$from_len是否已經(jīng)被賦值
for($temp_len=0;($temp_len-$from_len<$length)||$tag;$temp_len++){
$byte_code=ord(substr($str,$i,1));//一個字節(jié)的編碼
if($temp_len+1==$from){//記錄開始截取的開始字節(jié)位置
$from_i=$i;$from_len=$temp_len;$tag=false;
}
if($byte_code>=0&&$byte_code<128){//字符是占用幾個字節(jié),utf-8是變長編碼,根據(jù)每個字符的第一個字節(jié)可判斷出該字符占幾個字節(jié)
$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);
}
相關(guān)文章
PHP使用Session遇到的一個Permission denied Notice解決辦法
這篇文章主要介紹了PHP使用Session遇到的一個Permission denied Notice解決辦法,本文系統(tǒng)環(huán)境是ubuntu、Debian系統(tǒng),有很小的概率會遇到這個提示,需要的朋友可以參考下2014-07-07smarty模板中使用get、post、request、cookies、session變量的方法
這篇文章主要介紹了smarty模板中使用get、post、request、cookies、session變量的方法,需要的朋友可以參考下2014-04-04利用 fsockopen() 函數(shù)開放端口掃描器的實例
下面小編就為大家?guī)硪黄?fsockopen() 函數(shù)開放端口掃描器的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08thinkphp5 模型實例化獲得數(shù)據(jù)對象的教程
今天小編就為大家分享一篇thinkphp5 模型實例化獲得數(shù)據(jù)對象的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10PHP 中使用explode()函數(shù)切割字符串為數(shù)組的示例
explode()函數(shù)的作用:使用一個字符串分割另一個字符串,打散為數(shù)組。下面通過本文給大家介紹PHP 中使用explode()函數(shù)切割字符串為數(shù)組 ,需要的朋友可以參考下2017-05-05thinkphp中html:list標(biāo)簽傳遞多個參數(shù)實例
這篇文章主要介紹了thinkphp中html:list標(biāo)簽傳遞多個參數(shù)的解決方法,在處理參數(shù)傳遞的情況非常具有實用價值,需要的朋友可以參考下2014-10-10