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

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

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

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

將inc_function.php的

function str_cut($str, $maxlen, $type) {
		$str = str_trans_rev($str);
		$len = strlen($str);

		if ($len <= $maxlen) return str_tag_off(str_trans($str));
		for ($i=0;$i<($maxlen-1);$i++) {
			if (ord(substr($str,$i,1)) < 128) {
				$return_str .= substr($str,$i,1);
			} else {
				$return_str .= substr($str,$i,2);
				$i++;
			}
		}

		$str = str_tag_off(str_trans($str));
		$return_str = str_tag_off(str_trans($return_str));

		if ($type) return "".$return_str."..";
		else return $return_str."..";
	}

取代為

[TT] 修正UTF8字數截取亂碼 [TT] 修正UTF8字數截取亂碼 [TT] 修正UTF8字數截取亂碼 [TT] 修正UTF8字數截取亂碼
function str_cut($str, $maxlen, $type) {
// Sea Otter
// 代碼說明:對原有中文截取函數的修正
//      1、長度錯誤
//      2、位置錯誤
// 變更方式:修改
// 變更時間:2005.05.10
// 變更開始----------------------------------
/*
    // 原截取代碼
    if ($len <= $maxlen) return str_tag_off(str_trans($str));
    for ($i=0;$i<($maxlen-1);$i++) {
      if (ord(substr($str,$i,1)) < 128) {
        $return_str .= substr($str,$i,1);
      } else {
        $return_str .= substr($str,$i,2);
        $i++;
      }
    }
*/
        
    $str = str_tag_on(str_trans_rev($str));
    $i = 0;
    $l = 0;
    $len = strlen($str);
    $return_str = $str;
    $f = true;
    while ($i <= $len) {
       if (ord($str{$i}) < 0x80) {
            $l++;
            $i++;
      }
      else if (ord($str{$i}) < 0xe0) {
           $l++;
           $i += 2;
      }
      else if (ord($str{$i}) < 0xf0) {
           $l += 2;
           $i += 3;
      }
      else if (ord($str{$i}) < 0xf8) {
           $l += 1;
           $i += 4;
      }
      else if (ord($str{$i}) < 0xfc) {
           $l += 1;
           $i += 5;
      }
      else if (ord($str{$i}) < 0xfe) {
           $l += 1;
           $i += 6;
      }
      if (($l >= $maxlen - 1) && $f)  {
           $return_str = substr($str, 0, $i);
           $f = false;
      }


      if (($l > $maxlen) && ($i <=$len)) {
        $return_str = str_tag_off(str_trans($return_str))."..";
        if ($type) {
          $str = str_tag_off(str_trans($str));
          $return_str = "".$return_str."";
        }
        break;
      }
    }
    return $return_str;
  // 變更結束----------------------------------
  }
Author

現為網路社群行銷工作者。曾建立韓國部落格程式 Tatter Tools 臺灣中文社群、擔任 Mozilla Taiwan Firefox 社群版主與編輯 Wiki。熱愛學習語言藉以瞭解當地文化。現為 TutorABC / 巨匠 / 聯成外語學員,同時學習英文 (B2-C1) 與西班牙文 (A1)。 歡迎使用推薦人獎勵報名享折扣優惠,請跟業務報上我的 email: vsy.haha@gmail.com。

10 Comments

  1. 這個問題我也困擾很久
    真的有用耶
    感謝vsy提供分享^^

  2. 有沒有 MT 的? (^.^)
    之前改過,不過因為完全不熟 perl,改了半天沒成功….=.="

    我是不知道怎麼拿perl字串裡某個字元啦…
    C 的話可以用 str[n] 直接拿….

  3. 呃,我本來就是用這個網址傳送說,所以一樣不行
    欸..算了,想不出問題在哪XD

  4. 嗯,改好了,也美多了,跟vsy借來引用、引用嚕!

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

  6. JUTE WEBLOG Reply

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

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

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

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料