smarty中英文多編碼字符出現亂碼如何解決-創新互聯

這篇文章將為大家詳細講解有關smarty中英文多編碼字符出現亂碼如何解決,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

創新互聯是一家集網站建設,大城企業網站建設,大城品牌網站建設,網站定制,大城網站建設報價,網絡營銷,網絡優化,大城網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。

一般網站頁面的顯示都不可避免的會涉及子字符串的截取,這個時候truncate就派上用場了,但是它只適合英文用戶,對與中文用戶來說,使用 truncate會出現亂碼,而且對于中文英文混合串來說,截取同樣個數的字符串,實際顯示長度上卻不同,視覺上會顯得參差不齊,影響美觀。這是因為一個中文的長度大致相當于兩個英文的長度。此外,truncate也不能同時兼容GB2312, UTF-8等編碼。


改良的smartTruncate: 文件名: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;
    }
}
?>


以上代碼完整實現了truncate的原有功能,而且可以同時兼容GB2312和UTF-8編碼,在判斷字符長度的時候,一個中文字符算1.0,一個英文字符算0.5,所以在截取子字符串的時候不會出現參差不齊的情況.
插件的使用方式沒有特別之處,這里簡單測試一下:


{$content|smartTruncate:5:".."}($content等于"A中B華C人D民E共F和G國H")


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

關于smarty中英文多編碼字符出現亂碼如何解決就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

新聞標題:smarty中英文多編碼字符出現亂碼如何解決-創新互聯
文章轉載:http://m.kartarina.com/article40/dcpgho.html

成都網站建設公司_創新互聯,為您提供建站公司搜索引擎優化響應式網站動態網站定制網站做網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司
主站蜘蛛池模板: 亚洲日韩乱码中文无码蜜桃臀| av无码一区二区三区| 国产精品亚洲аv无码播放| 久久久久久国产精品免费无码| 无码aⅴ精品一区二区三区| 亚洲国产91精品无码专区| 久久久久亚洲av无码专区喷水| 无码人妻精品一区二区三区久久久| 国产午夜无码精品免费看| 爆乳无码AV一区二区三区| 亚洲精品无码久久千人斩| 人妻无码久久中文字幕专区 | 精品欧洲av无码一区二区| 日韩专区无码人妻| 久久亚洲AV成人无码| 久久久无码中文字幕久...| 白嫩无码人妻丰满熟妇啪啪区百度| av无码国产在线看免费网站| 亚洲国产精品无码专区| 国产成人无码a区在线视频| 乱人伦人妻中文字幕无码| 2021无码最新国产在线观看| 亚洲色偷拍另类无码专区| 寂寞少妇做spa按摩无码| 亚洲成A∨人片天堂网无码| 久久AV无码精品人妻出轨| 亚洲AV永久无码精品放毛片| 免费A级毛片无码视频| 亚洲精品偷拍无码不卡av| 国产50部艳色禁片无码| 国产精品无码日韩欧| 国模GOGO无码人体啪啪| 亚洲国产精品无码中文字| 少妇伦子伦精品无码STYLES| 无码国产福利av私拍| 日韩网红少妇无码视频香港| 精品无码一区二区三区亚洲桃色| 色窝窝无码一区二区三区| 18禁免费无码无遮挡不卡网站 | 中文有码无码人妻在线| 啊灬啊别停灬用力啊无码视频|