XML和PHP的中文顯示問題

解決了數據庫的中文顯示問題,現在又換成了XML文件了。
本來是想用XML存儲部分文字信息,這部分信息更改沒有數據庫裏頻繁,所以想用XML文件來存儲。由於前面的網頁和MYSQL裏的字符編碼制指定的都是gb2312,所以在新建的XML文件開頭裏就指定編碼:
文件:board.xml  
  公告信息1
  admin 
  公告信息2
  管理員
 
 
同時另寫了一個讀取php程序,用DOM讀取:
  $doc = new DOMDocument();
  $doc->load('board.xml' );
 
 $infors = $doc->getElementsByTagName("information" );
  foreach( $inforsas $infor )
  {
  $values = $infor->getElementsByTagName("value");
  $value = $values->item(0)->nodeValue;
 
  $authors =$infor->getElementsByTagName("author" );
  $author =$authors->item(0)->nodeValue;
  echo"$value - $author \n";
 }
?>
用IE打開,結果是亂碼,但是把網頁編碼調成UTF-8纔可以正常顯示。這下就奇怪了,等我把XML文件裏的encoding這個屬性去掉,發現默認的瀏覽器編碼就是UTF-8。這下有點麻煩了。之前我也說過了,一開始我就把網頁和數據庫的編碼設成了GB2312,這下可好,從XML讀出來的是UTF-8,網頁成混合亂碼了。
 
當時還想,也許是因爲使用DOM庫的原因,也許DOM庫不支持GB2312,也許不見得所有讀取XML文件的所有方法都不支持GB2312。隨後我又寫了個PHP程序,這次不調用DOM庫,改用php裏自帶的parser,說不定能實現呢。
$parser = xml_parser_create();//創建一個parser編輯器
xml_set_element_handler($parser,"startElement","endElement");//設立標籤觸發時的相應函數這裏分別爲startElement和endElenment
xml_set_character_data_handler($parser,"characterData");//設立數據讀取時的相應函數
$xml_file='board.xml';//指定所要讀取的xml文件,可以是url
if(!($fp = fopen($xml_file,"r"))) {
    die("could not open XMLinput");
}
$filehandler = fopen($xml_file,"r");//打開文件
$name=false;
$position=false;
while ($data =fread($filehandler, 4096))
{
    xml_parse($parser, $data,feof($filehandler));
     if (!xml_parse($parser, $data, feof($filehandler))){
        die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($parser)),
                   xml_get_current_line_number($parser)));
    }
   
}//每次取出4096個字節進行處理
fclose($filehandler);
xml_parser_free($parser);//關閉和釋放parser解析器
function startElement($parser_instance, $element_name, $attrs)       //起始標籤事件的函數
 {
   global $name,$position; 
  if($element_name=="author")
   {
   $name=true;
  $position=false;
   echo"名字:";
  }
  if($element_name=="value")
  {$name=false;
   $position=true;
   echo"信息:";
  }
}
function characterData($parser_instance, $xml_data)                 //讀取數據時的函數
{
   global $name,$position;
   if($position)
    echo$xml_data."
";
    if($name)
     echo$xml_data."
";
}
function endElement($parser_instance, $element_name)                //結束標籤事件的函數
{
 global $name,$position;
$name=false;
$position=false; 
}
?>

結果還是隻能用UTF-8編碼來看結果。
 
後來GOOGLE了一下,有人說XML默認的是UTF-8,如果想用gb2312,只能把這個XML在中文內核下存成gb2312內碼的文件,然後再讀取。可我的WINXP是通過裝語言包才導入的中文輸入,看來只能用UTF-8了。如果想用gb2312的話,只能把要存到XML文件的信息改存到database裏,這個又達不到練習的效果。
後來想了想,還是把所有的網頁都改成UTF-8編碼得了。這個工程就浩大了。
 
先是把程序裏指定HTML語句中charset全改掉,接着一運行,還是發現就算是在HTML網頁裏輸出的漢字還是原來的編碼,找了半天也沒查出原因了。
後來疑心是用UltraEdit編輯php文件保存的編碼不對,因爲是從某個從網上下的php文件更改來起步學習的。後來都在UltraEdit裏重新複製編輯後,還是沒能解決這個問題。
無奈之下,只好打開記事本,一個一個文件複製,最後存成UTF-8的格式,累死我了,一共二十多個文件啊。
只對在php程序裏修改還不夠,還要對mysql裏的各個table裏設的charset也要修改。
好不容易修改完,一運行,結果出現了一個Warning,吐血了要……
[start_session()]Warning:Cannot send session cache limiter - headersalready sent
這是蝦米毛病啊?!
只好再次求助GG大嬸。
據說有兩個原因會造成這個warning的出現
 
第一,
The PHP function such as headers(), used with start_session(), producesHTML headers. When the PHP fragments are placed in the body of the HTML, thiscauses errors because the PHP fragments are trying to put HTML headers withinthe HTML body. Solution:Put the PHP fragments before the HTML body tag.
(link:http://parallel.hpc.unsw.edu.au/~chee/IdiotErrors/node9.html
可我的start_session()絕對是在head tag之前就調用了,應該不是上面這個原因。
 
第二,
引用了UTF-8格式的文件,有些UTF-8格式的文件會在文件的開始放入判斷字元(BOM),可以啟用PHP.INI的設定 output_buffering= 4096
(link:http://info.mysql.cn/php/2006/0323/5499.html
我打開php.ini一看,裏面默認的值是off,更改,保存,重啓apache服務器,刷新網頁,果然是這個原因!
 
最後雖然解決了,可還是半喜半憂。這個程序本來是要放在某些帶php和mysql免費空間的,肯定沒有權限更改php.ini文件。萬一對方不支持,也只能用gb2312了……

 
 
發佈了0 篇原創文章 · 獲贊 0 · 訪問量 2498
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章