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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章