解析使用substr截取UTF-8中文字符串出現(xiàn)亂碼的問題
看這樣一段代碼吧(字符編碼為UTF-8):
<?
$str = '都知道strlen與mb_strlen是求字符串長(zhǎng)度的函數(shù)';
echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');
?>
運(yùn)行上述代碼,返回值如下:
66
34
怎么樣?strlen中,中文是三個(gè)字節(jié)的長(zhǎng)度,英文則是一個(gè)字節(jié)的長(zhǎng)度!mb_strlen中,都被計(jì)算為一字節(jié)的長(zhǎng)度!所以,我們有時(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 = '有效期最長(zhǎng)三個(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運(yùn)行報(bào)錯(cuò)Call to undefined function curl_init()的最新解決方法
其實(shí)在網(wǎng)上很早之前就出現(xiàn)過這個(gè)問題,網(wǎng)上百度了下,答案千篇一律,最近又遇到這個(gè)問題,但是百度出來的問題不能解決這個(gè)問題了,所以只能翻墻找答案,現(xiàn)在將解決的方法分享給大家,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11PHP將二維數(shù)組某一個(gè)字段相同的數(shù)組合并起來的方法
這篇文章主要介紹了PHP將二維數(shù)組某一個(gè)字段相同的數(shù)組合并起來的方法,涉及PHP多維數(shù)組操作的相關(guān)技巧,需要的朋友可以參考下2016-02-02php5中date()得出的時(shí)間為什么不是當(dāng)前時(shí)間的解決方法
從php5.10開始,php中加入了時(shí)區(qū)的設(shè)置,在php中顯示的時(shí)間都是格林威治標(biāo)準(zhǔn)時(shí)間,這就造成了我們 中國(guó)的用戶會(huì)差八個(gè)小時(shí)的問題!2008-06-06php流量統(tǒng)計(jì)功能的實(shí)現(xiàn)代碼
用php實(shí)現(xiàn)的流量統(tǒng)計(jì)功能代碼,本代碼僅供學(xué)習(xí)交流,其中必有不妥之處。請(qǐng)見諒2012-09-09PHP基于openssl實(shí)現(xiàn)的非對(duì)稱加密操作示例
這篇文章主要介紹了PHP基于openssl實(shí)現(xiàn)的非對(duì)稱加密操作,結(jié)合實(shí)例形式分析了openssl安裝、密鑰生成及php基于openssl的非對(duì)稱加密算法相關(guān)操作技巧,需要的朋友可以參考下2019-01-01PHP實(shí)現(xiàn)二維數(shù)組根據(jù)key進(jìn)行排序的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)二維數(shù)組根據(jù)key進(jìn)行排序的方法,涉及php數(shù)組的遍歷與排序相關(guān)操作技巧,需要的朋友可以參考下2016-12-12php實(shí)現(xiàn)的微信分享到朋友圈并記錄分享次數(shù)功能
這篇文章主要介紹了php實(shí)現(xiàn)的微信分享到朋友圈并記錄分享次數(shù)功能,結(jié)合實(shí)例形式分析了php微信分享功能接口調(diào)用及分享次數(shù)統(tǒng)計(jì)具體操作技巧,需要的朋友可以參考下2018-01-01