最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

smarty中英文多編碼字符截取亂碼問題解決方法

 更新時間:2014年10月28日 09:16:10   投稿:shichen2014  
這篇文章主要介紹了smarty中英文多編碼字符截取亂碼問題解決方法,涉及到對原有smartTruncate的修改,非常具有實用價值,需要的朋友可以參考下

本文實例講述了smarty中英文多編碼字符截取亂碼問題解決方法,分享給大家供大家參考。具體方法如下:

一般網(wǎng)站頁面的顯示都不可避免的會涉及子字符串的截取,這個時候truncate就派上用場了,但是它只適合英文用戶,對與中文用戶來說,使用 truncate會出現(xiàn)亂碼,而且對于中文英文混合串來說,截取同樣個數(shù)的字符串,實際顯示長度上卻不同,視覺上會顯得參差不齊,影響美觀。這是因為一個中文的長度大致相當(dāng)于兩個英文的長度。此外,truncate也不能同時兼容GB2312, UTF-8等編碼。
改良的smartTruncate: 文件名:modifier.smartTruncate.php
具體代碼如下:

復(fù)制代碼 代碼如下:
<?php
function smartDetectUTF8($string)
{
    static $result = array();
    if(! array_key_exists($key = md5($string), $result))
    {
        $utf8 = "
            /^(?:
                [\x09\x0A\x0D\x20-\x7E]                            # ASCII
                | [\xC2-\xDF][\x80-\xBF]                             # non-overlong 2-byte
                | \xE0[\xA0-\xBF][\x80-\xBF]                       # excluding overlongs
                | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}           # straight 3-byte
                | \xED[\x80-\x9F][\x80-\xBF]                      # excluding surrogates
                | \xF0[\x90-\xBF][\x80-\xBF]{2}                 # planes 1-3
                | [\xF1-\xF3][\x80-\xBF]{3}                          # planes 4-15
                | \xF4[\x80-\x8F][\x80-\xBF]{2}                  # plane 16
            )+$/xs
        ";
        $result[$key] = preg_match(trim($utf8), $string);
    }
    return $result[$key];
}
function smartStrlen($string)
{
    $result = 0;
    $number = smartDetectUTF8($string) ? 3 : 2;
    for($i = 0; $i < strlen($string); $i += $bytes)
    {
        $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1;
        $result += $bytes > 1 ? 1.0 : 0.5;
    }
    return $result;
}
function smartSubstr($string, $start, $length = null)
{
    $result = '''';
    $number = smartDetectUTF8($string) ? 3 : 2;
    if($start < 0)
    {
        $start = max(smartStrlen($string) + $start, 0);
    }
    for($i = 0; $i < strlen($string); $i += $bytes)
    {
        if($start <= 0)
        {
            break;
        }
        $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1;
        $start -= $bytes > 1 ? 1.0 : 0.5;
    }
    if(is_null($length))
    {
        $result = substr($string, $i);
    }
    else
    {
        for($j = $i; $j < strlen($string); $j += $bytes)
        {
            if($length <= 0)
            {
                break;
            }
            if(($bytes = ord(substr($string, $j, 1)) > 127 ? $number : 1) > 1)
            {
                if($length < 1.0)
                {
                    break;
                }
                $result .= substr($string, $j, $bytes);
                $length -= 1.0;
            }
            else
            {
                $result .= substr($string, $j, 1);
                $length -= 0.5;
            }
        }
    }
    return $result;
}
function smarty_modifier_smartTruncate($string, $length = 80, $etc = ''...'',
                                       $break_words = false, $middle = false)
{
    if ($length == 0)
        return '''';
    if (smartStrlen($string) > $length) {
        $length -= smartStrlen($etc);
        if (!$break_words && !$middle) {
            $string = preg_replace(''/\s+?(\S+)?$/'', '''', smartSubstr($string, 0, $length+1));
        }
        if(!$middle) {
            return smartSubstr($string, 0, $length).$etc;
        } else {
            return smartSubstr($string, 0, $length/2) . $etc . smartSubstr($string, -$length/2);
        }
    } else {
        return $string;
    }
}
?>

以上代碼完整實現(xiàn)了truncate的原有功能,而且可以同時兼容GB2312和UTF-8編碼,在判斷字符長度的時候,一個中文字符算1.0,一個英文字符算0.5,所以在截取子字符串的時候不會出現(xiàn)參差不齊的情況.
插件的使用方式?jīng)]有特別之處,這里簡單測試一下:
復(fù)制代碼 代碼如下:
{$content|smartTruncate:5:".."}($content等于"A中B華C人D民E共F和G國H")

顯示:A中B華C.. (中文符號長度算1.0,英文符號長度算0.5,并且考慮省略符號的長度)
不管你是使用GB2312編碼還是UTF-8編碼,你會發(fā)現(xiàn)結(jié)果都正確,這也是為什么我在插件名字里加上smart字樣的原因之一。

希望本文所述對大家的PHP程序設(shè)計有所幫助。

相關(guān)文章

  • yii2中LinkPager增加總頁數(shù)和總記錄數(shù)的實例

    yii2中LinkPager增加總頁數(shù)和總記錄數(shù)的實例

    本篇文章主要介紹了php中LinkPager增加總頁數(shù)和總記錄數(shù)的實例,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • PHP實現(xiàn)文件下載詳解

    PHP實現(xiàn)文件下載詳解

    本文從php實現(xiàn)下載的原理到具體的實現(xiàn)代碼,再到有可能出現(xiàn)的問題,以及使用其他方式實現(xiàn)的文件下載的代碼分享,都做了詳細(xì)說明,給有需要的小伙伴們參考下
    2014-11-11
  • 匹配csdn用戶數(shù)據(jù)庫與官方用戶的重合度并將重疊部分的用戶篩選出來

    匹配csdn用戶數(shù)據(jù)庫與官方用戶的重合度并將重疊部分的用戶篩選出來

    CSDN用戶數(shù)據(jù)泄漏導(dǎo)致官方用戶的安全受到了嚴(yán)重的威脅,故希望能把兩個站的用戶數(shù)據(jù)做個對比,把其中重疊部分的用戶篩選出來,并通知相應(yīng)用戶及時修改密碼,確保風(fēng)險將至最低
    2011-12-12
  • thinkphp5.1驗證碼及驗證碼驗證功能的實現(xiàn)詳解

    thinkphp5.1驗證碼及驗證碼驗證功能的實現(xiàn)詳解

    這篇文章主要介紹了thinkphp5.1驗證碼及驗證碼驗證功能的實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • php標(biāo)簽云的實現(xiàn)代碼

    php標(biāo)簽云的實現(xiàn)代碼

    下面的實現(xiàn)代碼,將標(biāo)簽從數(shù)據(jù)庫中搜出來,并格式化處理,使其以出現(xiàn)的次數(shù)為依據(jù)顯示出不同大小的文字連接
    2012-10-10
  • Yii框架中使用PHPExcel的方法分析

    Yii框架中使用PHPExcel的方法分析

    這篇文章主要介紹了Yii框架中使用PHPExcel的方法,簡單分析了Yii使用PHPExcel的相關(guān)操作技巧與注意事項,并附帶說明了Yii的autoload機(jī)制,需要的朋友可以參考下
    2019-07-07
  • PC端微信掃碼支付成功之后自動跳轉(zhuǎn)php版代碼

    PC端微信掃碼支付成功之后自動跳轉(zhuǎn)php版代碼

    這篇文章主要為大家詳細(xì)介紹了微信掃碼支付成功之后自動跳轉(zhuǎn)php版代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • PHP實現(xiàn)的英文名字全拼隨機(jī)排號腳本

    PHP實現(xiàn)的英文名字全拼隨機(jī)排號腳本

    這篇文章主要介紹了PHP實現(xiàn)的英文名字全拼隨機(jī)排號腳本,根據(jù)一個需求寫出的一個解決方案,需要的朋友可以參考下
    2014-07-07
  • PHP面試題之文件目錄操作

    PHP面試題之文件目錄操作

    本篇文章是我在之前面試這家公司時遇到的問題,當(dāng)時代碼寫的不全,后來通過查閱相關(guān)資料,整理出來的一份分享給大家
    2015-10-10
  • Yii2語言國際化自動配置詳解

    Yii2語言國際化自動配置詳解

    這篇文章主要介紹了Yii2語言國際化自動配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08

最新評論

安塞县| 怀化市| 贵港市| 海宁市| 甘肃省| 阿坝| 宁国市| 石林| 新干县| 安仁县| 积石山| 教育| 同江市| 通河县| 邵东县| 建始县| 榆中县| 威远县| 中方县| 梅河口市| 许昌县| 固始县| 界首市| 绥芬河市| 南汇区| 台东市| 区。| 东乡| 广昌县| 芜湖市| 房产| 黔西县| 武宣县| 隆德县| 木兰县| 盐池县| 普兰店市| 洪泽县| 大悟县| 邳州市| 陆良县|