xajax是PHP下一個非常好的ajax架構,雖然xajax自己說自己是一個庫(Library),但是我覺得它更像一個架構(Framework)。xajax是一個開源的 PHP 類庫 它能夠讓你黏合HTML、CSS、Javascript和PHP,並可以結合Smarty模板系統使用。
在運用Xoops的Page模組的時候,發現其不能和中文正常工作,特別是不能和UTF-8編碼的頁面一起工作,昨天在利用這個實現DataGrid的時候發現完全不能正常工作了,一直報“the XML response that was returned from the server is invalid”這個錯誤,Google了一下,發現不少人也有這個問題。結合之前解決Xoops的Page模組(感謝文明豬)的UTF-8使用問題的方法,終於發現了完美解決xajax庫使用中文的方法。
如果頁面採用GB2312或GBK作為編碼或字元集,一般網路上面提到的方法可以解決:需要注意的是common.php、server.php及server.php用到的php檔案(特別是產生資料的檔案)全部不要使用UTF-8編碼格式儲存而使用ASCII格式儲存。同時server.php輸出的資料內容最好也採用gb2312編碼。
在common.php前面定義
PHP代碼
define('XAJAX_DEFAULT_CHAR_ENCODING','GB2312');
再在調用時使用:
PHP代碼
$xajax = new xajax();
$xajax->decodeUTF8InputOn();
或者
PHP代碼
$xajax = new xajax('gb2312');
$xajax->setCharEncoding();
$xajax->decodeUTF8InputOn();
$objResponse = new xajaxResponse('gb2312');
如果頁面採用UTF-8字元集的話,網上一些人說使用UTF-8格式編碼就可以了,實際上即使全部使用UTF-8編碼也不能正常工作,還是會報錯:“the XML response that was returned from the server is invalid”。聯想到之前在IE下碰到UTF-8 BOM Bug(文章:IE下頁面無端端空出一行及utf8頁面無法顯示的解決方案 ),會不會這個地方伺服器傳回的XML檔案中也包含多個UTF-8 BOM內容呢?通過ethereal截獲資料包發現,伺服器返回的內容中還真是包含了多個UTF-8 BOM,可能還是IE使用的Microsoft XML Parser的UTF-8 BOM Bug吧。這樣解決辦法就出來了:所有頁面全部採用UTF8編碼並使用無UTF-8 BOM儲存(UltraEdit 操作方法:F12或另存新檔介面中格式下拉框選擇‘UTF-8-無 BOM’),頁麵包括xajax庫檔案、common.php檔案、server.php檔案。供訪問的頁面也可以使用無UTF-8 BOM儲存。
有時候返回的參數(特別是中文部分)被url編碼了,這個時候需要我們將返回的資料使用Urldecode進行處理,以便能夠正常完成後面的資料庫操作。
最新xajax 0.25下載地址:http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download
xajax中文手冊(HonestQiao第一版,FlyingHail修改版) http://www.flyinghail.net/?p=44
UTF-8 BOM解釋:"EF BB BF" 這三個位元組就叫BOM,BOM的全稱叫做"Byte Order Mard"。在UTF-8檔案中常用BOM來表明這個檔案是UTF-8檔案,而BOM的本意實在UTF-16中用來表示高低位元組序列的。
另外,PHP網站上說使用--enable-zend-multibyte可以解決這類問題,不過沒有嘗試,並且預計在PHP 6.0中會對Unicode做完美的支援。