2005
30

[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.   }
email this twitio.us twitthat!

閱讀這篇文章的人,他們也看:


Warning: Invalid argument supplied for foreach() in /home/gooloosc/public_html/blog/wp-content/plugins/wheredidtheygov1.php on line 98

年年有今日

2006: 卡介苗
2005: 有趣的Google祕聞
2005: Proxy 表
分類於: BLOG
文章功能:留言 | 引用 | 訂閱RSS , 有423名真人及309支假人讀過此文章。

這篇文章有 10則 迴響:

Hugo Said in 十月 1st, 2005 @3:29 上午 | 回覆 
1

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

優格 Said in 十月 1st, 2005 @6:10 上午 | 回覆 
2

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

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

Beata Said in 十月 1st, 2005 @4:07 下午 | 回覆 
3

你試試看用這個網址能不能傳送
http://beata.daxp.com/Blog/rserver.php?mode=tb&sl=20

vsy Said in 十月 1st, 2005 @6:31 下午 | 回覆 
4

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

JUTE Said in 十月 1st, 2005 @8:54 下午 | 回覆 
5

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

JUTE WEBLOG Said in 十月 1st, 2005 @9:00 下午 | 回覆 
6

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

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

DearJohn Said in 十月 3rd, 2005 @6:50 下午 | 回覆 
7

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

Ying Chou Said in 十月 5th, 2005 @5:16 上午 | 回覆 
8

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

焦爸 Said in 三月 24th, 2006 @6:13 上午 | 回覆 
9

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

Said in 七月 4th, 2008 @10:37 下午 | 回覆 
10

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

Using Internet Explorer Internet Explorer 6.0 on Windows Windows XP