ThinkPHP+Smarty模板中截取包含中英文混同的字串亂碼的解決方案

來源:互聯網
上載者:User
ThinkPHP+Smarty模板中截取包含中英文混合的字串亂碼的解決方案

好幾天沒寫部落格了,其實有好多需要總結的,因為最近一直在忙著做項目,但是困惑了幾天的Smarty模板中截取包含中英文混合的字串亂碼的問題,終於解決了,所以記錄下來,需要的朋友看一下:

出現亂碼的原因:

對於字串的截取,truncate函數只適合英文使用者,對與中文使用者來說,使用 truncate會出現亂碼,而且對於中文英文混合串來說,截取同樣個數的字串,實際顯示長度上卻不同,一個中文的長度大致相當於兩個英文的長度。此外,truncate不能同時相容GB2312、UTF-8等編碼。

解決方案:自己寫一個擴充類使用

ThinkPHP使用的smarty的truncate變數調節器所在的類檔案位置:ThinkPHP\Library\Vendor\Smarty\plugins,其中有一個就是modifier.truncate.php,我們不用這個,我們自己寫一個來實現

檔案名稱:modifier.smartTruncate.php

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;    }}?>

注意:在判斷字元長度時,一個中文字元算1.0,一個英文字元算0.5,截取子字串時不會出現參差不齊的情況.

使用方法:

{$content|smartTruncate:5:"..."}

ok,測試沒有問題有問歡迎指出

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.