實現中文字串擷取無亂碼的方法
肖巖utf-8中文擷取函式
在php中,substr()函式擷取帶有中文字串的話,可能會出現亂碼,這是因為中西文乙個位元組所占有的位元組數不一樣,而substr的長度引數是按照位元組去算的,在gb2312編碼時,乙個中文佔2個位元組,英文為1個位元組,而在utf-8編碼當中,乙個中文可能占有2個或3個位元組,英文或半形標點佔1位元組。
解決方法
utf-8編碼的字元可能由1-3個位元組組成,具體數目可以由第乙個位元組判斷出來。
第乙個位元組大於224的,它與它之後的2個位元組一起組成乙個utf-8字元
第乙個位元組大於192小於224的,它與它之後的1個位元組組成乙個utf-8字元,否則第乙個位元組本身就是乙個英文本元(包括數字和一小部分標點符號)。
<?php
$a="我是程式設計師";
class dx
elseif(ord(substr($string,$n,1))>192)
else
}return $str; }
else
}public function msub($string,$start,$length)
else
}return $str; }
else
} }$sub = new dx();
echo $sub->msubstr($a,0,8);//我是程式
?>
除了上面的方法,還可以使用mb_substr來解決,**如下:
<?php
$a="wo的name是中國!";
echo mb_substr($a,0,9,'utf-8');//wo的name是中
echo substr($a,0,15);//wo的name是中
?>
十八哥版 通過字元擷取
<?php
header("content-type:text/html;charset=utf-8");
$str='中華人aaa民cc共和ee國wwww';
function utf8sub($str,$len)
$length=strlen($str);
$offset=0; //擷取高位位元組時的偏移量
$chars=0; //擷取到的字元數
$res=''; //擷取到的字串
while($chars< $len &&$offset<=$length)else if(substr($high,0,3)=='110')else if (substr($high,0,4)=='1110')else if(substr($high,0,5)=='11110')else if(substr($high,0,6)=='111110')else if(substr($high,0,7)=='1111110')
$res .=substr($str,$offset,$count);
$chars += 1;
$offset += $count;
}return $res;
//print_r($res);
}echo utf8sub($str,5);
?>
php擷取中文無亂碼
在php中需要對字串進行擷取,如果沒有裝mb擴充套件 mb substr函式 對中文擷取就需要進行相應的處理。下面是對字串 世s界s的功s 夫薩的mn是非得失sdf dsf dsf 達 擷取10個字元,最後的輸出是 世s界s的 編碼均為utf8 ss 世s界s的功s 夫薩的mn是非得失sdf dsf...
中文擷取無亂碼的PHP
str 待擷取的字串 len 擷取的字元個數 chars 已經擷取的字元數 res 儲存的字串 chars 儲存已經擷取的字串個數 offset 擷取的偏移量 length 字串的位元組數 若 len str的字元個數,造成無謂的while迴圈,offset length限定 function ut...
php中文擷取無亂碼方法
直接使用php函式substr擷取中文字元可能會出現亂碼,主要是substr可能硬生生的將乙個中文字元 鋸 成兩半。解決辦法 1 使用mbstring擴充套件庫的mb substr擷取就不會出現亂碼了。2 自己書寫擷取函式,但效率不如用mbstring擴充套件庫來得高。3 如果僅是為了輸出擷取的串,...