主題: 有關 big5 化後許蓋功的亂碼原因部份詳解 - 請各位學長多多指點 作者: FIEND 於 十月 26, 2005, 03:39:33 上午 小弟還在實驗可不可行難度多高 :
因為小弟想做一個新的個人網站 覺得非用 big5 版來做才行 所以才會異想天開的想要big5 化 目前並沒有大動土木的計劃想先收集各位學長的意見 望比較早玩 plog 的學長們指導在下 : 小弟的思路及想法上是否可行 ... 1. 小弟打算以 big5 為底層 放入 databases 整個網以 big5 編碼 吐出來 . 2. 修正所有 方土土 及 許功蓋的亂碼問題 . 3. 以 utf-8 的方式吐出 rss 讓 big5 版本的 rss 也可以交換連結 . 經過 研究 可以發現 : 以 magic_quotes_gpc 為 on 的情況 之下 許蓋功問題會有亂碼的情況 ... 以後台 修改文章為例 小弟先提出 許蓋功的問題 ..... big5 化産生 bug 的産生原因 : vim class/action/admin/adminpostmanagementcommonaction.class.php 可以發現 : 以 這句為例 - 引用 $this->_postText = trim(Textfilter::xhtmlize($this->_request->getValue( "postText" ))); 第一個 method -> getValue() : 這個 method 可以在 vim class/net/request.class.php 找到 內容為 : 引用 function getValue( $key, $defaultValue = null ) { // get the value from the parent $value = parent::getValue( $key, $defaultValue ); // now if magic quotes are enabled and the input parameter is not an array // and the feature has not been disabled, then strip the slashes // fiend if( get_magic_quotes_gpc() && !is_array( $value ) && $this->_stripSlashes ) { $value = stripslashes( $value ); // post 字串 第一次 做 stripslashes } return( $value ); } 所以它會先判斷 你的 伺服器環境 決定是否要先 消除一次 脱溢字元 而第二次發生在 : 參考 vim ./class/data/textfilter.class.php 的 : 引用 function xhtmlize( $string ) { // use kses in the "xhtml converter" mode $config =& Config::getConfig(); if( $config->getValue( "xhtml_converter_enabled" )) { $kses = new kses( true, $config->getValue( "xhtml_converter_aggresive_mode_enabled")); $result = $kses->Parse( $string ); // if balanceTags wasn't broken, we could use it... //$result = Textfilter::balanceTags( $result ); } else $result = $string; return $result; } 由 它 宣告的 kses 實體可以追到 : vim class/data/kses.class.php <-- 還好命名很有規則 查起來快多了 .. ^^ 引用 function Parse($string = "") { // 看到沒 它就是兇手 重覆 判斷 伺服器設定 是否 有自動脱溢 超全域陣列變數 然後再執行 stripslashes 而造成 寫入資料庫前就變成亂碼 if (get_magic_quotes_gpc()) { $string = stripslashes($string); // 第二次 過濾 脱溢字元 } $string = $this->_no_null($string); $string = $this->_js_entities($string); $string = $this->_normalize_entities($string); $string = $this->_hook($string); $string = $this->_split($string); if( $this->xhtmlConverterOnly ) { // and also xhtmlize a few more tags... $string = str_replace( "<br>", "<br />", $string ); $string = str_replace( "<hr>", "<hr />", $string ); } return $string; } 所以造成寫入時的big5 字元亂碼 .... ###############################################################################3 目前小弟還在實驗 big5 化會不會有什麼大問題可不可行 還有望各位學長多多指點 先提出個人 測試後的結果 .... 近期會多發表一些有關 big5 化的一些發現 主題: Re: 有關 big5 化後許蓋功的亂碼原因部份詳解 - 請各位學長多多指點 作者: FIEND 於 十月 26, 2005, 04:01:56 上午 針對這個問題 小弟提出個人小小的看法
1. 我們 需清查 get_magic_quotes_gpc on 的情況下 會做幾次addslashes 什麼情況會做 有那些流程造成重覆做的 要 列出 清單 再加以修正 這個方式極為麻煩.... 2. 這個 big5 會造成的 bug - 官方當初會這樣寫是沒有考慮big5 的問題 但這樣寫可能有它的用意 但是也造成 big5 化後 的 bug 只是小弟還不熟這套系統需要多研究看看 . 但是依小弟的看法 get_magic_quotes_gpc 這個判斷 其實可以 放在寫入資料庫時字串再去做判斷 如果 get_magic_quotes_gpc 為 off 時 則 進 db 前 都會執行 mysql_escape_string 來阻絕 injection 攻擊 反之 不加 這樣改起來速度會快點 但有可能 違反官方當初這樣做的用意 若 各位學長在這段有 經驗者 望指點在下 小弟 閱讀程式不算慢 但是要全部看完 也還真有點累 ^^!! 主題: Re: 有關 big5 化後許蓋功的亂碼原因部份詳解 - 請各位學長多多指點 作者: FIEND 於 十月 26, 2005, 06:54:36 上午 另外再提出一個方案 : 1. 以 utf-8 為底層 放入 databases 但是前台整個網以 big5 編碼 吐出來 . 後台維持使用 utf-8 2. 以 utf-8 的方式吐出 rss . 也就是乾脆做一個 可以吐 big5 或 gb2312 的 前台其它都用 utf-8 不過好像 這樣就沒什麼挑戰性了 . 只要 解決 utf-8 --> big5 方土土的問題就差不多了 ~~~~ 這是最終的方案啦 小弟還是堅持 用 big5 當底層 真的沒法子解 再說 .... |