中文字串截取无乱码的问题
生活随笔
收集整理的這篇文章主要介紹了
中文字串截取无乱码的问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
UTF-8中文截取函數(shù)
在PHP中,substr()函數(shù)截取帶有中文字符串的話,可能會出現(xiàn)亂碼,這是因為中西文一個字節(jié)所占有的字節(jié)數(shù)不一樣,而substr的長度參數(shù)是按照字節(jié)去算的,在GB2312編碼時,一個中文占2個字節(jié),英文為1個字節(jié),而在UTF-8編碼當中,一個中文可能占有2個或3個字節(jié),英文或半角標點占1字節(jié)。
解決方法
UTF-8編碼的字符可能由1-3個字節(jié)組成,具體數(shù)目可以由第一個字節(jié)判斷出來。
第一個字節(jié)大于224的,它與它之后的2個字節(jié)一起組成一個UTF-8字符
第一個字節(jié)大于192小于224的,它與它之后的1個字節(jié)組成一個UTF-8字符,否則第一個字節(jié)本身就是一個英文字符(包括數(shù)字和一小部分標點符號)。
在PHP中,substr()函數(shù)截取帶有中文字符串的話,可能會出現(xiàn)亂碼,這是因為中西文一個字節(jié)所占有的字節(jié)數(shù)不一樣,而substr的長度參數(shù)是按照字節(jié)去算的,在GB2312編碼時,一個中文占2個字節(jié),英文為1個字節(jié),而在UTF-8編碼當中,一個中文可能占有2個或3個字節(jié),英文或半角標點占1字節(jié)。
解決方法
UTF-8編碼的字符可能由1-3個字節(jié)組成,具體數(shù)目可以由第一個字節(jié)判斷出來。
第一個字節(jié)大于224的,它與它之后的2個字節(jié)一起組成一個UTF-8字符
第一個字節(jié)大于192小于224的,它與它之后的1個字節(jié)組成一個UTF-8字符,否則第一個字節(jié)本身就是一個英文字符(包括數(shù)字和一小部分標點符號)。
substr() 函數(shù)返回字符串的一部分。
語法
substr(string,start,length) 注意substr(1,2,3),第三個參數(shù),截取返回的長度是按字節(jié)來的 <?php$a="我是程序員";class Dx{private $str;public function Utf_substr($string,$start,$length) // utf-8編碼的下截取規(guī)則{if(strlen($string)>$length){// $n=0;$str="";$len=$start+$length;for($i=$start;$i<$len;$i++){if(ord(substr($string,$i,1))>224){$str.=substr($string,$i,3);// $n+=3;$i=$i+2;}elseif(ord(substr($string,$i,1))>192){$str.=substr($string,$i,2);$i++;}else{$str.=substr($string,$i,1);}}return $str;}else{return $string;} }public function GB_substr($string,$start,$length) //gb2312 編碼下的截取規(guī)則{if(strlen($string)>$length){$str="";$len=$start+$length;for($i=$start;$i<$len;$i++){if(ord(substr($string,$i,1))>0xa0) //如果ASCii碼大于0xa0就是半個漢字;{$str.=substr($string,$i,2);$i++;}else{$str.=substr($string,$i,1);}}return $str;}else{return $string;} }}$sub = new Dx();echo $sub->Utf_substr($a,0,8).'<br/>';//我是程序?> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">除了上面的方法,還可以使用mb_substr來解決,代碼如下: <?php$a="wo的name是中國!";echo mb_substr($a,0,9,'UTF-8');//wo的name是中echo substr($a,0,15);//wo的name是中 ?>轉載于:https://www.cnblogs.com/tham/p/6827457.html
總結
以上是生活随笔為你收集整理的中文字串截取无乱码的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: boost库 bind/function
- 下一篇: 隐藏文字的另一种方法