PHP中文字串截斷無亂碼解決方案

來源:互聯網
上載者:User

一個比較好用的字串截取函數:

function substring($str, $start, $length){ //比較好用字串截取函數    $len = $length;    if($length < 0){    $str = strrev($str);    $len = -$length;    }    $len= ($len < strlen($str)) ? $len : strlen($str);    $tmpstr = "";    for ($i= $start; $i < $len; $i ++)    {           if (ord(substr($str, $i, 1)) > 0xa0)           {             $tmpstr .= substr($str, $i, 2);             $i++;           } else {             $tmpstr .= substr($str, $i, 1);           }    }    if($length < 0) $tmpstr = strrev($tmpstr);    return $tmpstr;}

使用方法樣本:

$str1 = '我是一串比較長的中文不帶英文';$str2 = '我是一串比較長的中文帶yingwen';$len = strlen($str1);echo '<br />'.$len;  //return 28$len = strlen($str2);echo '<br />'.$len;  //return 29echo '<br />';    echo substring($str1, 0, 11);    echo '<br />';echo substring($str2, 0, 11);        echo '<br />';echo substring($str1, 16, 28);    echo '<br />';echo substring($str2, 16, 29);    

結果顯示:

2829我是一串比較我是一串比較中文不帶英文中文帶yingwen

這個函數十分有用,比如用來截斷比較長的檔案名稱,但是要在中間加上...,可以這樣來做:

function formatName($str, $size){    $len = strlen($str);    if(strlen($str) > $size) {        $part1 = substring($str, 0, $size / 2);        $part2 = substring($str, $len - ($size/2), $len);        return $part1 . "..." . $part2;    } else {        return $str;    }}

另外,網上看到一種超級簡單的中文截斷解決方案,試用了一下,效果也不錯:

echo substr($str1,0,10).chr(0);

原理解釋:

chr(0)不是null
07null是什麼都沒有,而chr(0)的值是0。表示成16進位是0x00,表示成二進位是00000000
08雖然chr(0)不會顯示出什麼,但是他是一個字元。
09當漢字被截斷時,根據編碼規則他總是要把後邊的其他字元拉過來一起作為漢字解釋,這就是出現亂碼的原因。而值為0x81到0xff與0x00組合始終都顯示為“空”
10根據這一特點,在substr的結果後面補上一個chr(0),就可以防止出現亂碼了

 ---------------------------- 20120705更新:  以上方法雖好,但是偶爾還是會碰到亂碼,原因未深究。不過可以用以下的方法,對UTF8字元文本屢試不爽。注意:該方法中將漢字計算為1單位長度,英文一個字母1單位長度,所以截斷時需要注意長度設定。 計算長度的方法:
function strlen_UTF8($str){    $len = strlen($str);    $n = 0;    for($i = 0; $i < $len; $i++) {        $x = substr($str, $i, 1);        $a  = base_convert(ord($x), 10, 2);        $a = substr('00000000'.$a, -8);        if (substr($a, 0, 1) == 0) {        }elseif (substr($a, 0, 3) == 110) {            $i += 1;        }elseif (substr($a, 0, 4) == 1110) {            $i += 2;        }        $n++;    }    return $n;} // End strlen_UTF8;

字串截斷函數:

function subString_UTF8($str, $start, $lenth)    {        $len = strlen($str);        $r = array();        $n = 0;        $m = 0;        for($i = 0; $i < $len; $i++) {            $x = substr($str, $i, 1);            $a  = base_convert(ord($x), 10, 2);            $a = substr('00000000'.$a, -8);            if ($n < $start){                if (substr($a, 0, 1) == 0) {                }elseif (substr($a, 0, 3) == 110) {                    $i += 1;                }elseif (substr($a, 0, 4) == 1110) {                    $i += 2;                }                $n++;            }else{                if (substr($a, 0, 1) == 0) {                    $r[ ] = substr($str, $i, 1);                }elseif (substr($a, 0, 3) == 110) {                    $r[ ] = substr($str, $i, 2);                    $i += 1;                }elseif (substr($a, 0, 4) == 1110) {                    $r[ ] = substr($str, $i, 3);                    $i += 2;                }else{                    $r[ ] = '';                }                if (++$m >= $lenth){                    break;                }            }        }        return join($r);    } // End subString_UTF8;

使用方法和之前介紹的一樣,比如formatName可以實現如下(這對漢字長度做了小最佳化):

function formatName($str, $size){    $len = strlen_UTF8($str);    $one_len = strlen($str);    $size = $size * 1.5 * $len / ($one_len);    if(strlen_UTF8($str) > $size) {        $part1 = subString_UTF8($str, 0, $size / 2);        $part2 = subString_UTF8($str, $len - ($size/2), $len);        return $part1 . "..." . $part2;    } else {        return $str;    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.