中文擷取無亂碼

2021-06-23 09:55:49 字數 1588 閱讀 3907

實現中文字串擷取無亂碼的方法

肖巖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 如果僅是為了輸出擷取的串,...