解析使用substr截取UTF-8中文字符串出現(xiàn)亂碼的問題
更新時(shí)間:2013年06月20日 11:29:20 作者:
本篇文章是對使用substr截取UTF-8中文字符串出現(xiàn)亂碼的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
我們知道有時(shí)候使用substr來截取UTF-8中文字符串的時(shí)候,經(jīng)常會(huì)出現(xiàn)亂碼,為什么會(huì)出現(xiàn)這樣的問題呢,本文告訴你答案。
看這樣一段代碼吧(字符編碼為UTF-8):
<?
$str = '都知道strlen與mb_strlen是求字符串長度的函數(shù)';
echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');
?>
運(yùn)行上述代碼,返回值如下:
66
34
怎么樣?strlen中,中文是三個(gè)字節(jié)的長度,英文則是一個(gè)字節(jié)的長度!mb_strlen中,都被計(jì)算為一字節(jié)的長度!所以,我們有時(shí)候用substr來截取UTF-8中文字符串的時(shí)候,經(jīng)常會(huì)出現(xiàn)亂碼,就是這個(gè)原因了!
下面提供一個(gè)截取UTF-8字符串的函數(shù):
function cutstr($sourcestr,$cutlength){
$returnstr = '';
$i = 0;
$n = 0;
$str_length = strlen($sourcestr);
$mb_str_length = mb_strlen($sourcestr,'utf-8');
while(($n < $cutlength) && ($i <= $str_length)){
$temp_str = substr($sourcestr,$i,1);
$ascnum = ord($temp_str);
if($ascnum >= 224){
$returnstr = $returnstr.substr($sourcestr,$i,3);
$i = $i + 3;
$n++;
}
elseif($ascnum >= 192){
$returnstr = $returnstr.substr($sourcestr,$i,2);
$i = $i + 2;
$n++;
}
elseif(($ascnum >= 65) && ($ascnum <= 90)){
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n++;
}
else{
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n = $n + 0.5;
}
}
if ($mb_str_length > $cutlength){
$returnstr = $returnstr . "...";
}
return $returnstr;
}
使用例子:
<?
$str = '有效期最長三個(gè)月,超過有效期系統(tǒng)將自動(dòng)刪除本條信息';
//echo strlen($str);
//echo '<hr />'.mb_strlen($str,'utf-8');
echo '<hr />'.$str;
echo '<hr />'.cutstr($str,24);
?>
看這樣一段代碼吧(字符編碼為UTF-8):
復(fù)制代碼 代碼如下:
<?
$str = '都知道strlen與mb_strlen是求字符串長度的函數(shù)';
echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');
?>
運(yùn)行上述代碼,返回值如下:
66
34
怎么樣?strlen中,中文是三個(gè)字節(jié)的長度,英文則是一個(gè)字節(jié)的長度!mb_strlen中,都被計(jì)算為一字節(jié)的長度!所以,我們有時(shí)候用substr來截取UTF-8中文字符串的時(shí)候,經(jīng)常會(huì)出現(xiàn)亂碼,就是這個(gè)原因了!
下面提供一個(gè)截取UTF-8字符串的函數(shù):
復(fù)制代碼 代碼如下:
function cutstr($sourcestr,$cutlength){
$returnstr = '';
$i = 0;
$n = 0;
$str_length = strlen($sourcestr);
$mb_str_length = mb_strlen($sourcestr,'utf-8');
while(($n < $cutlength) && ($i <= $str_length)){
$temp_str = substr($sourcestr,$i,1);
$ascnum = ord($temp_str);
if($ascnum >= 224){
$returnstr = $returnstr.substr($sourcestr,$i,3);
$i = $i + 3;
$n++;
}
elseif($ascnum >= 192){
$returnstr = $returnstr.substr($sourcestr,$i,2);
$i = $i + 2;
$n++;
}
elseif(($ascnum >= 65) && ($ascnum <= 90)){
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n++;
}
else{
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n = $n + 0.5;
}
}
if ($mb_str_length > $cutlength){
$returnstr = $returnstr . "...";
}
return $returnstr;
}
使用例子:
復(fù)制代碼 代碼如下:
<?
$str = '有效期最長三個(gè)月,超過有效期系統(tǒng)將自動(dòng)刪除本條信息';
//echo strlen($str);
//echo '<hr />'.mb_strlen($str,'utf-8');
echo '<hr />'.$str;
echo '<hr />'.cutstr($str,24);
?>
您可能感興趣的文章:
- 淺析PHP substr,mb_substr以及mb_strcut的區(qū)別和用法
- 『PHP』PHP截?cái)嗪瘮?shù)mb_substr()使用介紹
- PHP中文處理 中文字符串截取(mb_substr)和獲取中文字符串字?jǐn)?shù)
- PHP截取漢字亂碼問題解決方法mb_substr函數(shù)的應(yīng)用
- PHP substr 截取字符串出現(xiàn)亂碼問題解決方法[utf8與gb2312]
- Mysql字符串截取函數(shù)SUBSTRING的用法說明
- php去掉字符串的最后一個(gè)字符附substr()的用法
- JS 截取字符串substr 和 substring方法的區(qū)別
- php截取字符串函數(shù)substr,iconv_substr,mb_substr示例以及優(yōu)劣分析
相關(guān)文章
PHP改進(jìn)計(jì)算字符串相似度的函數(shù)similar_text()、levenshtein()
PHP 原生的similar_text()函數(shù)、levenshtein()函數(shù)對中文漢字支持不好,我自己寫了一個(gè),測試使用正常,推薦給大家,如果有什么問題,請留言2014-10-10
phpmyadmin顯示utf8_general_ci中文亂碼的問題終級篇
自己寫PHP也有一年多了,然后編碼問題卻老是沒有得到好的解決,自己的情況是這樣的,網(wǎng)頁顯示完全正常,在phpmyadmin數(shù)據(jù)庫顯示中文亂碼,不管是簡體還是繁體,只要是中文都是亂碼2013-04-04
php使用str_replace替換多維數(shù)組的實(shí)現(xiàn)方法分析
這篇文章主要介紹了php使用str_replace替換多維數(shù)組的實(shí)現(xiàn)方法,結(jié)合具體實(shí)例對比分析了php針對多維數(shù)組的遍歷與替換操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-06-06
為你總結(jié)一些php系統(tǒng)類函數(shù)
這篇文章是小編為大家總結(jié)的一些php系統(tǒng)類函數(shù),很實(shí)用,需要的朋友千萬不要錯(cuò)過。2015-10-10
PHP 刪除一個(gè)目錄及目錄下的所有文件的函數(shù)代碼
PHP刪除一個(gè)目錄及目錄下的文件代碼,即刪除目錄或刪除文件。2010-05-05
PHP 正則判斷中文UTF-8或GBK的思路及具體實(shí)現(xiàn)
UTF-8匹配: 在javascript中,要判斷字符串是中文是很簡單的,下面有個(gè)不錯(cuò)的判斷示例,需要的朋友可以參考下2013-11-11
PHP 數(shù)據(jù)結(jié)構(gòu) 算法描述 冒泡排序 bubble sort
多次循環(huán)進(jìn)行比較,每次比較時(shí)將最大數(shù)移動(dòng)到最上面。每次循環(huán)時(shí),找出剩余變量里的最大值,然后減小查詢范圍。這樣經(jīng)過多次循環(huán)以后,就完成了對這個(gè)數(shù)組的排序2011-07-07
用PHP將數(shù)據(jù)導(dǎo)入到Foxmail的實(shí)現(xiàn)代碼
下面的原理就是用PHP生成一個(gè)文件,然后下載并把這些資料導(dǎo)入他們的Foxmail地址簿中。2010-09-09

