修復 recent comments 把中文字切一半的問題
我在這篇《Fixing wordpress plugin - recent comments》介紹了怎麼樣修正以便安裝 recent comments 在某些比較新版本的 wordpress 裡。然後網友 1614 留訊息問可不可以解決中文字切一半的問題,所以我就研究了一下,然後就不小心解決了。
首先,先把 PHP 的 multibyte string extension 裝起來,對於 FreeBSD 來說,就是把 converters/php5-mbstring 裝起來即可。如下:
SHELL> cd /usr/ports/converters/php5-mbstring SHELL> make install ...
基本上,我們將使用 mb_strimwidth() 幫我們切文字,這個函式知道一段字串在 terminal 上會有多「寬」,好比說兩個全形字加三個半形字,會被認知為寬度為 (2*2+3*1)=7,然後依據給定的寬數「切」字串。所以,只要改用 mb_strimwidth() 來作真正的切字串的動作即可。
請修改 recent comments 的 kjgrc_excerpt() 這個函式如下:
function kjgrc_excerpt ($text,$chars_per_comment,$chars_per_word,$tag,$output)
{
$length = strlen(str_replace($tag,"",strip_tags($output)));
$length = $chars_per_comment - $length;
$length = $length -2; // we will add three dots at the end
if ($length < 0) $length = 0;
if (strlen($text) > $length) {
+ if (function_exists('mb_strimwidth')) {
+ $text = mb_strimwidth($text, 0, $chars_per_comment, '...', 'utf-8');
+ }
+ else {
$text = substr($text,0,$length);
$text = substr($text,0,strrpos($text,' '));
// last word exceeds max word length:
if ((strlen($text) - strrpos($text,' ')) > $chars_per_word) {
$text = substr($text,0,strlen($text)-3);
}
$text = $text . "...";
+ }
}
#$text = "[EXCERPT]: '$text'";
return "$text";
}
其中,前面有 + 號的部分,就是要加的部分。如果系統裡的 PHP 有 mb_strimwidth() 可以用的話,就會用來切字串,就不會造成中文字或其他非 ASCII 字元,從中間被切一半的狀況了。
至於英文字被分屍的問題,這是原本的設計使然。在其 Option 頁面中,有一項 Wrap long words at: [n] characters 的選項,可以選擇英文字字母數超過 n 的話,就會被切成兩半。把這個值社長一點,英文字就比較不會被分屍了。當然,這是因為沒有什麼好的方法,可以依據音節將長英文字切斷分行,然後用 hyphen 接的緣故。相對於版面的破壞,這一點點缺陷,我想是可以被接受的。



2 Comments
非常感謝!有趣的是原始碼裡的格式看起來簡直就像是之前就有這段,但是最後被抽走似的。有種玩拼圖的感覺。
關於英文分屍,我發現是 wordwrap() 的問題。只要試著把 wrap long words 選項設小一點就會發現中文句子被他插空格變得七零八落,這是其一。其二是若有中英夾雜,而中英之間沒有留空格的話,就會有英文(即使是很短的字也一樣)被分屍:例如「很多中文abc」這段全無空格,就會在英文部份被分屍或在中文部份被插入空格。中文被插空格短期勉強可以忍受,英文單字分屍就超出我身為文字工作者的容忍範圍了。(笑)
若是以「不破壞版面」為目的,則理想的 wordwrap() 我想應該是要能夠不計 CJK,只針對字串中的非 CJK 字元計算字數來切斷吧。
不過已經很感謝您修好中文的問題了,其他的只是閒聊罷了。 =)
因為全形字佔位大約是半形字的兩倍,若我想限定句字的長度以免換行,而在後端加上『...』。想請問若以 JavaScript 來切字可否做到全形字作兩個字元計算?
我試過用 substring(),它把全形字當一個字元計算的。
5 Backlinks
一直看我的 Recent Comment 不順眼,常常一大串留言,就變成只有 ... 三個字元。而且有斷在中文字,而變成亂碼的情形。這個問題最後在 JeffHuang 的「修復 recent comments 把中文字切一半的問題[IMG] 」這篇找到答案,只要 PHP 的 mb_strimwidth()[IMG] 一行就好了,還好,不然原本還想去做 utf8 每個字元 length 計算哩。有時,還真是有意想不到的簡單解決方案。
meta.php, monthly.php) 2) fix get-recent-comment 對UTF8字元的斷行。 由於此外掛在斷行時會破壞UTF8中文碼字元,造成無法通過W3C的檢查頁面。(我終於找到元凶了!)修改方法來自JeffHung.Blog。此篇有詳細的解決方法。 現在在W3C做檢查,終於可以跑出錯誤清單了。有一半是加入flickr相簿的語法問題,這部份我可以不用理會。至於其它錯誤,有時間會慢慢修正。
問題1: 在option page裡出現fatal error 解決: http://www.jeffhung.net/blog/articles/jeffhung/316/ 問題2: 留言中文字切一半變亂碼的問題 解決: 基本的解決方法是使用PHP multibyte string function來切留言 http://www.jeffhung.net/blog/articles/jeffhung/337/
晚上九點多的時候,寶貝說可以裝一下 get recent comments,參考了寶貝寫的修改文件,寶貝真厲害(*_*崇拜~) 然後覺得sidebar排版不好看,動手調了一下,然後又覺得照片底下的那個空間好小,不知道寫什麼好,自我介紹也已經寫在「about-關於我」這篇文章裡了
不過,mod_janews 會有一個缺點,就是無法 (沒有) 處理中文字的斷行問題,這樣會造成在不該的地方亂斷行。例如: 應該在這裡斷行的,卻斷在?… 後來翻到 “修復 recent comments 把中文字切一半的問題” 這篇文章,參考其中的作法,稍作修改。現在,總算可以正確的斷行了!!
Post a Comment