2010年2月2日

PHP中xajax庫中文問題及提示返回XML文件無效的解決辦法

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