解析使用substr截取UTF-8中文字符串出現(xiàn)亂碼的問題
更新時間:2013年06月20日 11:29:20 作者:
本篇文章是對使用substr截取UTF-8中文字符串出現(xiàn)亂碼的問題進行了詳細的分析介紹,需要的朋友參考下
我們知道有時候使用substr來截取UTF-8中文字符串的時候,經(jīng)常會出現(xiàn)亂碼,為什么會出現(xiàn)這樣的問題呢,本文告訴你答案。
看這樣一段代碼吧(字符編碼為UTF-8):
<?
$str = '都知道strlen與mb_strlen是求字符串長度的函數(shù)';
echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');
?>
運行上述代碼,返回值如下:
66
34
怎么樣?strlen中,中文是三個字節(jié)的長度,英文則是一個字節(jié)的長度!mb_strlen中,都被計算為一字節(jié)的長度!所以,我們有時候用substr來截取UTF-8中文字符串的時候,經(jīng)常會出現(xiàn)亂碼,就是這個原因了!
下面提供一個截取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 = '有效期最長三個月,超過有效期系統(tǒng)將自動刪除本條信息';
//echo strlen($str);
//echo '<hr />'.mb_strlen($str,'utf-8');
echo '<hr />'.$str;
echo '<hr />'.cutstr($str,24);
?>
看這樣一段代碼吧(字符編碼為UTF-8):
復制代碼 代碼如下:
<?
$str = '都知道strlen與mb_strlen是求字符串長度的函數(shù)';
echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');
?>
運行上述代碼,返回值如下:
66
34
怎么樣?strlen中,中文是三個字節(jié)的長度,英文則是一個字節(jié)的長度!mb_strlen中,都被計算為一字節(jié)的長度!所以,我們有時候用substr來截取UTF-8中文字符串的時候,經(jīng)常會出現(xiàn)亂碼,就是這個原因了!
下面提供一個截取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 = '有效期最長三個月,超過有效期系統(tǒ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截斷函數(shù)mb_substr()使用介紹
- PHP中文處理 中文字符串截取(mb_substr)和獲取中文字符串字數(shù)
- PHP截取漢字亂碼問題解決方法mb_substr函數(shù)的應用
- PHP substr 截取字符串出現(xiàn)亂碼問題解決方法[utf8與gb2312]
- Mysql字符串截取函數(shù)SUBSTRING的用法說明
- php去掉字符串的最后一個字符附substr()的用法
- JS 截取字符串substr 和 substring方法的區(qū)別
- php截取字符串函數(shù)substr,iconv_substr,mb_substr示例以及優(yōu)劣分析
相關(guān)文章
php運行報錯Call to undefined function curl_init()的最新解決方法
其實在網(wǎng)上很早之前就出現(xiàn)過這個問題,網(wǎng)上百度了下,答案千篇一律,最近又遇到這個問題,但是百度出來的問題不能解決這個問題了,所以只能翻墻找答案,現(xiàn)在將解決的方法分享給大家,有需要的朋友們可以參考借鑒,下面來一起學習學習吧。2016-11-11PHP將二維數(shù)組某一個字段相同的數(shù)組合并起來的方法
這篇文章主要介紹了PHP將二維數(shù)組某一個字段相同的數(shù)組合并起來的方法,涉及PHP多維數(shù)組操作的相關(guān)技巧,需要的朋友可以參考下2016-02-02php5中date()得出的時間為什么不是當前時間的解決方法
從php5.10開始,php中加入了時區(qū)的設(shè)置,在php中顯示的時間都是格林威治標準時間,這就造成了我們 中國的用戶會差八個小時的問題!2008-06-06PHP基于openssl實現(xiàn)的非對稱加密操作示例
這篇文章主要介紹了PHP基于openssl實現(xiàn)的非對稱加密操作,結(jié)合實例形式分析了openssl安裝、密鑰生成及php基于openssl的非對稱加密算法相關(guān)操作技巧,需要的朋友可以參考下2019-01-01PHP實現(xiàn)二維數(shù)組根據(jù)key進行排序的方法
這篇文章主要介紹了PHP實現(xiàn)二維數(shù)組根據(jù)key進行排序的方法,涉及php數(shù)組的遍歷與排序相關(guān)操作技巧,需要的朋友可以參考下2016-12-12php實現(xiàn)的微信分享到朋友圈并記錄分享次數(shù)功能
這篇文章主要介紹了php實現(xiàn)的微信分享到朋友圈并記錄分享次數(shù)功能,結(jié)合實例形式分析了php微信分享功能接口調(diào)用及分享次數(shù)統(tǒng)計具體操作技巧,需要的朋友可以參考下2018-01-01