[亂搞] UTF-8化後對於字串長度的處理

phpBB-TW Knowledge Base
收集網友們在竹貓所發表的教學主題或文章,以利分享!
(僅供瀏覽,由版主群維護)
回覆文章
神川小羽
調皮の小羽
調皮の小羽
文章: 1464
註冊時間: 2004-05-01 05:55
來自: 謎樣之筱語
聯繫:

[亂搞] UTF-8化後對於字串長度的處理

文章 神川小羽 »

原文


(以下修改請注意您必須有安裝 mbstring模組 安裝方法請點此處)
在PHPBB中以及各種PHPBB外掛模組很常使用到\r
strlen函數來計算字串的長度並使用substr函數來取部分的字串\r
但是在UTF-8編碼卻無法正確的切割字串,導致常常會有最後
一個文字被切成亂碼的情況
例如原本字串是(?#125; 其實是 不過這不是重點 重點請看字串最後一個字)

代碼: 選擇全部

[公告]意見反映版面不?#125;放訪客發表
卻可能被切成(?#125; 其實是 不過這不是重點 重點請看字串最後一個字)

代碼: 選擇全部

[公告]意見反映版面不?#125;放訪客發议.
這是很討厭的情況,不過事實上還有方法可以解決的
這時候請改用\r
mb_strlen函數來代替 strlen函數\r
請參閱\r
http://www.php.net/manual/en/function.mb-strlen.php
請使用mb_substr函數來代替 substr函數\r
請參閱\r
http://www.php.net/manual/en/function.mb-substr.php

例如以下範例
(修改前)

代碼: 選擇全部

      if (strlen($line['topic_title']) > 15) 
      { 
         $line_topic_title = substr($line['topic_title'], 0, 15)." ..."; 
      } 
(修改後)

代碼: 選擇全部

      if (mb_strlen($line['topic_title'], 'utf-8') > 15) 
      { 
         $line_topic_title = mb_substr($line['topic_title'], 0, 15,'utf-8')." ..."; 
      } 
PS.這兩個函數對於英數字元 中文字元都是 1 所以您應該調整實際要取的長度(小一點或原來的一半左右)
最後由 神川小羽 於 2006-02-05 16:09 編輯,總共編輯了 1 次。
-.-

頭像
心靈捕手
默默耕耘的老師
默默耕耘的老師
文章: 8643
註冊時間: 2004-04-30 01:54
來自: Taiwan

文章 心靈捕手 »

目前, 論壇語系使用 utf-8 編碼者, 都有可能碰到這問題.

您的解法有憑有據, 怎麼會是 '亂搞' 呢?
所以, 我將它移動到 "教學文件庫" 版面. ;-)
施比受有福,歡迎來信賜教,謝謝 & 再見!
祝福您 好運 ^_^
歡迎加入★★心靈捕手★★ :: 討論區!!
http://wang5555.hopto.org/phpBB3/
p.s. 奉老婆之命:在晚上十一點前,得關機睡覺!!!

神川小羽
調皮の小羽
調皮の小羽
文章: 1464
註冊時間: 2004-05-01 05:55
來自: 謎樣之筱語
聯繫:

文章 神川小羽 »

當初在公司的時候,因為已經開始習慣用UTF-8來解決衝碼的時候,結果被老闆問到\r
為何最後的字串都會這樣,所以卯起來去PHP官方找解決方案,沒想到亂搞亂搞居然解決了
所以事實上是歪打正著解決的。

另外還是要特別強調,在修改前請確認你的主機是有安裝mbstring模組的,不然只會出現錯誤訊息唷。
-.-

回覆文章

回到「教學文件庫」