修正UTF-8數字截取尾端亂碼的BUG

修正UTF-8數字截取尾端亂碼的BUG

以下這段代碼可以修正UTF-8截取尾端亂碼的BUG
原始出處及版權所屬為 夢遊華人中文網 所有
不過 夢遊華人中文網 那邊的文章中,代碼中卻顯示出一堆亂碼,閱讀上非常不便。
我將代碼整理過之後放在這提供給各位參考。
上圖為改過之後的樣子




開啟 inc_function.php 搜尋

php · [高亮] · [原始]

  1. function str_cut($str, $maxlen, $type)
function str_cut($str, $maxlen, $type)

將下列代碼取代掉整個 str_cut 函數

php · [高亮] · [原始]

  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.   }
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 = "<span title=\\"$str\\">".$return_str."</span>";
        }
        break;
      }
    }
    return $return_str;
  // 變更結束----------------------------------
  }

» 後記
跳船到WP之後,將 cut_str 做了些簡化…

php · [高亮] · [原始]

  1. function cut_str($str, $maxlen) {
  2.     $i = 0; $l = 0; $f = true;
  3.     $len = strlen($str);
  4.     while ($i <= $len) {
  5.         if (ord($str{$i}) < 0×80) { $l++; $i++;
  6.         }
  7.         elseif (ord($str{$i}) < 0xe0) { $l++; $i += 2;
  8.         }
  9.         elseif (ord($str{$i}) < 0xf0) { $l += 2; $i += 3;
  10.         }
  11.         elseif (ord($str{$i}) < 0xf8) { $l += 1; $i += 4;
  12.         }
  13.         elseif (ord($str{$i}) < 0xfc) { $l += 1; $i += 5;
  14.         }
  15.         elseif (ord($str{$i}) < 0xfe) { $l += 1; $i += 6;
  16.         }
  17.         if (($l >= $maxlen - 1) && $f)  {
  18.            $str = substr($str, 0, $i);
  19.            $f = false;
  20.         }
  21.         if (($l > $maxlen) && ($i <=$len)) {
  22.             $str .= "…";
  23.             break;
  24.         }
  25.     }
  26.     return $str;
  27.   }
function cut_str($str, $maxlen) {
    $i = 0; $l = 0; $f = true;
    $len = strlen($str);
    while ($i <= $len) {
		if (ord($str{$i}) < 0x80) { $l++; $i++;
		}
		elseif (ord($str{$i}) < 0xe0) { $l++; $i += 2;
		}
		elseif (ord($str{$i}) < 0xf0) { $l += 2; $i += 3;
		}
		elseif (ord($str{$i}) < 0xf8) { $l += 1; $i += 4;
		}
		elseif (ord($str{$i}) < 0xfc) { $l += 1; $i += 5;
		}
		elseif (ord($str{$i}) < 0xfe) { $l += 1; $i += 6;
		}
		if (($l >= $maxlen - 1) && $f)  {
           $str = substr($str, 0, $i);
           $f = false;
		}
		if (($l > $maxlen) && ($i <=$len)) {
			$str .= "…";
			break;
		}
	}
    return $str;
  }

5 Responses to “修正UTF-8數字截取尾端亂碼的BUG”

  1. vsy Says:

    哇,這個好棒啊^_^
    撿回去用用看..:)

  2. Beata Says:

    呵~
    想不到你也是夜貓哩~
    歡迎參觀^

  3. vsy Says:

    真詭異,我有傳送一篇引用過來,沒有顯示..o_o;

  4. Beata Says:

    咦?還真~奇怪哩~
    是bug嗎?

  5. Raie Says:

    不小心看到這篇讓我的 TattorTools 變正常了, 感恩啊~ ^__^

Leave a Comment