PHP兌現中文字元的無亂碼截斷

來源:互聯網
上載者:User
PHP實現中文字元的無亂碼截斷

PHP內建的substr()函數不能對中文字元進行很好的截斷處理,對於一些中英文混合的字元會出現亂碼的情況。下面提供兩種解決函數。

?

1、GB2312編碼方式的截斷

?

function msubstr($str, $start, $len) {    if (strlen($str)-$start < $len)  return false;    $tmpstr = "";    $strlen = $start + $len;     for($i = 0; $i < $strlen; $i++) {         if(ord(substr($str, $i, 1)) > 0xa0) {   //0xa0 表示中文漢字編碼的第一個編碼字元ASCII 碼值都大於0xa0            $tmpstr .= substr($str, $i, 2);            $i++;         } else            $tmpstr .= substr($str, $i, 1);     }     return $tmpstr . "...";} 

?

2、utf8格式下的中文字元截斷

?

UTF-8編碼的字元可能由1~3個位元組組成, 具體數目可以由第一個位元組判斷出來。(理論上可能更長,但這裡假設不超過3個位元組)

第一個位元組大於224的,它與它之後的2個位元組一起組成一個UTF-8字元

第一個位元組大於192小於224的,它與它之後的1個位元組組成一個UTF-8字元

否則第一個位元組本身就是一個英文字元(包括數字和一小部分標點符號)。

?

//$sourcestr 是要處理的字串//$cutlength 為截取的長度(即字數)function cut_str($sourcestr,$cutlength){   $returnstr='';   $i=0;   $n=0;   $str_length=strlen($sourcestr);//字串的位元組數   while (($n<$cutlength) and ($i<=$str_length))    {      $temp_str=substr($sourcestr,$i,1);      $ascnum=Ord($temp_str);//得到字串中第$i位字元的ascii碼      if ($ascnum>=224)    //如果ASCII位高與224,      {         $returnstr=$returnstr.substr($sourcestr,$i,3); //根據UTF-8編碼規範,將3個連續的字元計為單個字元                  $i=$i+3;            //實際Byte計為3         $n++;            //字串長度計1      }       elseif ($ascnum>=192) //如果ASCII位高與192,      {         $returnstr=$returnstr.substr($sourcestr,$i,2); //根據UTF-8編碼規範,將2個連續的字元計為單個字元         $i=$i+2;            //實際Byte計為2         $n++;            //字串長度計1      }       elseif ($ascnum>=65 && $ascnum<=90) //如果是大寫字母,      {         $returnstr=$returnstr.substr($sourcestr,$i,1);         $i=$i+1;            //實際的Byte數仍計1個         $n++;            //但考慮整體美觀,大寫字母計成一個高位字元      }       else                //其他情況下,包括小寫字母和半形標點符號,      {         $returnstr=$returnstr.substr($sourcestr,$i,1);         $i=$i+1;            //實際的Byte數計1個         $n=$n+0.5;        //小寫字母和半形標點等與半個高位字元寬...      }    }          if ($str_length>$cutlength){          $returnstr = $returnstr . "...";//超過長度時在尾處加上省略符號      }     return $returnstr;}
?

?

?

?

1 樓 zeroneta 2011-09-26

呵呵 那我就在來個 UTF-8截取無亂碼
function utf8( $a, $s = '' )
{
preg_match_all( '/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/', $a, $d, PREG_PATTERN_ORDER );
return join( $s, $d[0] );
}

2 樓 zeroneta 2011-09-26

調用方式


utf8( substr( '截取我', 0, 1 ) );

3 樓 bupt_roy 2011-09-29

zeroneta 寫道

調用方式


utf8( substr( '截取我', 0, 1 ) );



高手,學習學習,哈哈

  • 相關文章

    聯繫我們

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