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做完美的支持。