[TT] 修正UTF8字數截取亂碼

IE的使用者感覺應該比較明顯,Fx頂多只會顯示出問號(置入式行銷又一例XD),這個問題之前DearJohn也跟我問過,那時雖然印象中有看過解決方法,但是卻因為做法麻煩又沒什麼大礙就沒記下

碰巧在Beata這邊看到,是整個修改好的程式碼,就拿來用了,有用有保佑,現在不會有亂碼或問號發生了,修改完後記得版面設定字數縮減那邊也要調整一下,會變的跟原本不太一樣這樣

原始出處為夢遊華人中文網

將inc_function.php的

  1. function str_cut($str, $maxlen, $type) {
  2.   $str = str_trans_rev($str);
  3.   $len = strlen($str);
  4.  
  5.   if ($len <= $maxlen) return str_tag_off(str_trans($str));
  6.   for ($i=0;$i<($maxlen-1);$i++) {
  7.    if (ord(substr($str,$i,1)) < 128) {
  8.     $return_str .= substr($str,$i,1);
  9.    } else {
  10.     $return_str .= substr($str,$i,2);
  11.     $i++;
  12.    }
  13.   }
  14.  
  15.   $str = str_tag_off(str_trans($str));
  16.   $return_str = str_tag_off(str_trans($return_str));
  17.  
  18.   if ($type) return "<span title="$str">".$return_str."..</span>";
  19.   else return $return_str."..";
  20.  }

取代為

  1. function str_cut($str, $maxlen, $type) {
  2. // Sea Otter
  3. // 代碼說明:對原有中文截取函數的修正
  4. //      1、長度錯誤
  5. //      2、位置錯誤
  6. // 變更方式:修改
  7. // 變更時間:2005.05.10
  8. // 變更開始———————————-
  9. /*
  10.     // 原截取代碼
  11.     if ($len <= $maxlen) return str_tag_off(str_trans($str));
  12.     for ($i=0;$i<($maxlen-1);$i++) {
  13.       if (ord(substr($str,$i,1)) < 128) {
  14.         $return_str .= substr($str,$i,1);
  15.       } else {
  16.         $return_str .= substr($str,$i,2);
  17.         $i++;
  18.       }
  19.     }
  20. */
  21.        
  22.     $str = str_tag_on(str_trans_rev($str));
  23.     $i = 0;
  24.     $l = 0;
  25.     $len = strlen($str);
  26.     $return_str = $str;
  27.     $f = true;
  28.     while ($i <= $len) {
  29.        if (ord($str{$i}) < 0×80) {
  30.             $l++;
  31.             $i++;
  32.       }
  33.       else if (ord($str{$i}) < 0xe0) {
  34.            $l++;
  35.            $i += 2;
  36.       }
  37.       else if (ord($str{$i}) < 0xf0) {
  38.            $l += 2;
  39.            $i += 3;
  40.       }
  41.       else if (ord($str{$i}) < 0xf8) {
  42.            $l += 1;
  43.            $i += 4;
  44.       }
  45.       else if (ord($str{$i}) < 0xfc) {
  46.            $l += 1;
  47.            $i += 5;
  48.       }
  49.       else if (ord($str{$i}) < 0xfe) {
  50.            $l += 1;
  51.            $i += 6;
  52.       }
  53.       if (($l >= $maxlen - 1) && $f)  {
  54.            $return_str = substr($str, 0, $i);
  55.            $f = false;
  56.       }
  57.  
  58.  
  59.       if (($l > $maxlen) && ($i <=$len)) {
  60.         $return_str = str_tag_off(str_trans($return_str))."..";
  61.         if ($type) {
  62.           $str = str_tag_off(str_trans($str));
  63.           $return_str = "<span title="$str">".$return_str."</span>";
  64.         }
  65.         break;
  66.       }
  67.     }
  68.     return $return_str;
  69.   // 變更結束———————————-
  70.   }
    • DearJohn
    • 10月 3rd, 2005

    太感動啦…
    困擾已久的問題終於解決了!
    衷心感謝Beata和vsy…

    • Ying Chou
    • 10月 5th, 2005

    感謝vsy的分享!
    終於解決這個問題!^^

    • JUTE WEBLOG
    • 10月 1st, 2005

    在vsy那邊看到的,一開始用筆記本修個半天,難度不高,只是看錯碼,所以老編不好,花了十幾分鐘。

    編好後,看起來功能列更漂亮了,只要再做點細部調整就OK,謝謝vsy分享嚕!

    • 焦爸
    • 3月 24th, 2006

    真的非常感謝解決這個惱人的問題~

    • 7月 4th, 2008

    我連inc_function.php也不知道在那… :twisted: :twisted:
    有誰告訴一下我?:cry:
    再看亂碼的倒不如用回IE……… :twisted:

  1. No trackbacks yet.

CommentLuv Enabled