森林之原
五月 23, 2012, 12:37:17 am *
歡迎光臨, 訪客. 請先 登入註冊一個帳號.

請輸入帳號, 密碼以及預計登入時間
新聞: 森林之原歡迎您的蒞臨!
森林之原提供自由軟體的支援,包括繁體中文的翻譯。
 
   首頁   說明 搜尋 日曆 登入 註冊  
頁: [1]   向下
  寄送主題  |  列印  
作者 主題: SMF 1.1rc中文亂碼修改(新年快樂!)  (閱讀 13108 次)
0 會員 以及 2 訪客 正在閱讀本篇主題.
eyesofkids
TaiwanJoomla站長
友站版主
*
離線 離線

文章: 14


個人網站
« 於: 十二月 30, 2005, 04:37:56 am »

修改的檔案在這篇文章最後的連結處可以下載。
說明如下:
1.各Joomla模組中文截字問題
用mb_substr及mb_strlen取代substr與strlen即可(環境要支援mbstring)。或是用以下附的utf8.php中的utf8_substr與utf8_strlen函式(要先include進來)

2.SMF論壇首頁,最新文章標題中文截字問題
問題點:Sources/Subs.php中的851行函式shorten_subject問題。
解法:
用utf8.php中的utf8_substr與utf8_strlen函式(要先include進來)取代此函式中的substr與strlen。

3.搜尋結果的中文截字問題
問題點:Sources/Search.php中自1112行的函式prepareSearchContext問題。
解法:
1170~1193中的substr與strlen用utf8.php中的utf8_substr與utf8_strlen函式(要先include進來)取代。
以及preg_match_all的修辭字加上/u

4.貼文的內文中文奇特亂碼現象(某些特定字如"頁"、"預"…)
問題點:Sources/Subs.php中的parse_bbc函式,有關於 xA0與?取代函式(preg_replace)影響。共有兩處:一在行1702~1707間。另一在行1737~1744之間。
解法:
把Array中的
程式碼:
'?' => "\xA0"
砍了,或是在修辭字加上/u

預估中文截字問題有可能會出現的地方:
附屬功能:最新文章(SMF原有的)、日曆、私人訊息…

感謝來自dokuwiki的好用utf-8函式庫,據說比mbstring的效能更好。

趁2005快結束時,貢獻這個小小修改給SMF中文愛好者~~ Grin
讓SMF社群在新的一年更茁壯~~~~~~~ smiley01_058

有關這個修改的問題回報到以下網址,我有空閒時間會很樂意幫忙:
http://www.taiwanmambo.com/index.php?option=com_smf&Itemid=139&topic=499.msg1466#msg1466
向版主檢舉   已記錄

TaiwanJoomla.com /TaiwanMambo.com
Joomla! 開放原始碼網站系統
resnick
初學者
*
離線 離線

文章: 3


« 回覆文章 #1 於: 一月 01, 2006, 09:28:25 pm »

Dear all:

因為更新到1.1 RC2,因此發現原文的方法必須稍微修正,首先是

1. subs.php請找到 1784~1786行

程式碼:

1784      $data = strtr($data, array('&#039;' => '\'', '&nbsp;' => "\xA0", '&quot;' => '>">', '"' => '<"<', '&lt;' => '<lt<'));
1785      $data = preg_replace(array('~(?<=[\s>\.(;\'"]|^)((?:http|https|ftp|ftps)://[\w\-_%@:|]+(?:\.[\w\-_%]+)*(?::\d+) :cheesy:?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-
             _\~%\.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i', '~(?<=[\s>(\'<]|^)(www(?:\.[\w\-_]+)+(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-_\~%
              \.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i'), array('[url]$1[/url]', '[url=http://$1]$1[/url]'), $data);
1786      $data = strtr($data, array('\'' => '&#039;', "\xA0" => '&nbsp;', '>">' => '&quot;', '<"<' => '"', '<lt<' => '&lt;'));


將1784和1786 註解掉 得到如下:

程式碼:

1784      //$data = strtr($data, array('&#039;' => '\'', '&nbsp;' => "\xA0", '&quot;' => '>">', '"' => '<"<', '&lt;' => '<lt<'));
1785      $data = preg_replace(array('~(?<=[\s>\.(;\'"]|^)((?:http|https|ftp|ftps)://[\w\-_%@:|]+(?:\.[\w\-_%]+)*(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-
             _\~%\.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i', '~(?<=[\s>(\'<]|^)(www(?:\.[\w\-_]+)+(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-_\~%
              \.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i'), array('[url]$1[/url]', '[url=http://$1]$1[/url]'), $data);
1786      //$data = strtr($data, array('\'' => '&#039;', "\xA0" => '&nbsp;', '>">' => '&quot;', '<"<' => '"', '<lt<' => '&lt;'));


另外找到 1819~1824

程式碼:

1819     $data = strtr($data, array($breaker => '< >', '&nbsp;' => "\xA0"));
1820     $data = preg_replace(
1821     '/(?<=[>;:!? \xA0\]()]|^)([\w\.]{' . $modSettings['fixLongWords'] . ',})/e',
1822     "preg_replace('/(.{" . ($modSettings['fixLongWords'] - 1) . "})/', '\\\$1< >', '\$1')",
1823     $data);
1824     $data = strtr($data, array('< >' => $breaker, "\xA0" => '&nbsp;'));


將1819和1824註解掉,1821加上修飾字/u
程式碼:

1819     //$data = strtr($data, array($breaker => '< >', '&nbsp;' => "\xA0"));
1820     $data = preg_replace(
1821     '/(?<=[>;:!? \xA0\]()]|^)([\w\.]{' . $modSettings['fixLongWords'] . ',})/ue',
1822     "preg_replace('/(.{" . ($modSettings['fixLongWords'] - 1) . "})/', '\\\$1< >', '\$1')",
1823     $data);
1824     //$data = strtr($data, array('< >' => $breaker, "\xA0" => '&nbsp;'));


不過這樣還是不行,因為後來發現預覽的時候是OK的,但是發出去還是亂了,因此後來發現是Subs-Post.php搞的鬼
請找到Subs-Post.php的261~264行

程式碼:

261     if (!$previewing)
262          $message = strtr(implode('', $parts), array('  ' => '&nbsp; ', "\n" => '<br />', "\xA0" => '&nbsp;'));
263     else
264          $message = strtr(implode('', $parts), array('  ' => '&nbsp; ', "\xA0" => '&nbsp;'));


改為

程式碼:

261     if (!$previewing)
262          $message = strtr(implode('', $parts), array('  ' => '&nbsp; ', "\n" => '<br />'));
263     else
264     $message = strtr(implode('', $parts), array('  ' => '&nbsp; '));


這樣就大功告成了。

檔案下載:修正檔下載
解壓縮後,直接覆蓋 sources 資料夾就OK了。

注意,我沒改search.php 喔,所以如果搜尋有問題的話,還是先參考eyesofkids 的文章改吧。

resnick
« 最後編輯時間: 一月 01, 2006, 09:38:55 pm 由 resnick » 向版主檢舉   已記錄
Andrew::
魔,羯
*
離線 離線

文章: 217



個人網站
« 回覆文章 #2 於: 一月 01, 2006, 10:41:58 pm »

多謝各位分享
向版主檢舉   已記錄

尋夢的�
初學者
*
離線 離線

文章: 17



« 回覆文章 #3 於: 三月 12, 2006, 03:59:51 am »

resnick前輩的修改法中

Subs.php
程式碼:
1784      //$data = strtr($data, array('&#039;' => '\'', '&nbsp;' => "\xA0", '&quot;' => '>">', '"' => '<"<', '&lt;' => '<lt<'));
1785      $data = preg_replace(array('~(?<=[\s>\.(;\'"]|^)((?:http|https|ftp|ftps)://[\w\-_%@:|]+(?:\.[\w\-_%]+)*(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-
             _\~%\.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i', '~(?<=[\s>(\'<]|^)(www(?:\.[\w\-_]+)+(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-_\~%
              \.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i'), array('[url]$1[/url]', '[url=http://$1]$1[/url]'), $data);
1786      //$data = strtr($data, array('\'' => '&#039;', "\xA0" => '&nbsp;', '>">' => '&quot;', '<"<' => '"', '<lt<' => '&lt;'));

那二行註解掉會有問題!
就小弟的論壇中, 如果註解掉,
如果開啟autolink, 那你在文章中
如果出現網址和表情符號的話
表情符號 parse會出錯!

所以註解掉的二行, 把  "\xA0" 的都去掉
« 最後編輯時間: 三月 12, 2006, 04:48:55 am 由 尋夢的 » 向版主檢舉   已記錄
resnick
初學者
*
離線 離線

文章: 3


« 回覆文章 #4 於: 三月 12, 2006, 03:05:57 pm »

謝謝你,其實我有發現這個問題,可是只要你的網址有用1784      $data = strtr($data, array('&#039;' => '\'', '&nbsp;' => "\xA0", '&quot;' => '>">', '"' => '<"<', '&lt;' => '<lt<'));
1785      $data = preg_replace(array('~(?<=[\s>\.(;\'"]|^)((?:http|https|ftp|ftps)://[\w\-_%@:|]+(?:\.[\w\-_%]+)*(?::\d+) cheesy?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-
             _\~%\.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i', '~(?<=[\s>(\'<]|^)(www(?:\.[\w\-_]+)+(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-_\~%
              \.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i'), array('[url]$1
', '$1'), $data);
1786      $data = strtr($data, array('\'' => '&#039;', "\xA0" => '&nbsp;', '>">' => '&quot;', '<"<' => '"', '<lt<' => '&lt;'));[/code]

改為

程式碼:
1784      $data = strtr($data, array('&#039;' => '\'', '&quot;' => '>">', '"' => '<"<', '&lt;' => '<lt<'));
1785      $data = preg_replace(array('~(?<=[\s>\.(;\'"]|^)((?:http|https|ftp|ftps)://[\w\-_%@:|]+(?:\.[\w\-_%]+)*(?::\d+) :cheesy:?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-
             _\~%\.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i', '~(?<=[\s>(\'<]|^)(www(?:\.[\w\-_]+)+(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#+:\'\\\\]*|[\(\{][\w\-_\~%
              \.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i'), array('[url]$1[/url]', '[url=http://$1]$1[/url]'), $data);
1786      $data = strtr($data, array('\'' => '&#039;', '>">' => '&quot;', '<"<' => '"', '<lt<' => '&lt;'));
« 最後編輯時間: 三月 12, 2006, 03:30:03 pm 由 resnick » 向版主檢舉   已記錄
resnick
初學者
*
離線 離線

文章: 3


« 回覆文章 #5 於: 三月 12, 2006, 03:44:42 pm »

附上檔案,請自行下載更新!!

[附件已被管理員刪除]
向版主檢舉   已記錄
jamespx
見習生
**
離線 離線

文章: 67


« 回覆文章 #6 於: 三月 31, 2006, 12:18:34 pm »

SMF 1.1RC2 又釋出新的 patch。

我試著更新 1.1RC2 之後,發覺,原本中文的「項」「因」「頁」「預」,並沒有改善。

要不要將大夥兒的修改結果,提供給 SMF 官方網站參考?

不然,等正式版釋出,還要這樣改,會不會很麻煩? smiley01_022

我那個測試用的論壇是 SMF 1.1RC2 patched,英文語系介面,UTF-8 編碼。
« 最後編輯時間: 三月 31, 2006, 01:03:45 pm 由 jamespx » 向版主檢舉   已記錄
Andrew::
魔,羯
*
離線 離線

文章: 217



個人網站
« 回覆文章 #7 於: 四月 02, 2006, 11:20:10 am »

1.1 正式版出之後就不會有這個問題了
那個 patch 只是補漏洞而已, 沒有新功能.
向版主檢舉   已記錄

jamespx
見習生
**
離線 離線

文章: 67


« 回覆文章 #8 於: 四月 02, 2006, 01:45:49 pm »

聽 Andrew 這麼說,我就放一百個心了。 smiley01_057

很期待 SMF 1.1 正式版釋出。

不過,說實在話,SMF 1.0.x 用到現在,非常滿意,沒有升級的迫切需要。 smiley01_037
向版主檢舉   已記錄
頁: [1]   向上
  寄送主題  |  列印  
 
前往:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Valid XHTML 1.0! Valid CSS!