设为首页 收藏本站
查看: 729|回复: 0

[经验分享] XML和PHP的中文显示问题

[复制链接]

尚未签到

发表于 2017-3-31 09:30:55 | 显示全部楼层 |阅读模式
解决了数据库的中文显示问题,现在又换成了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了……

 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-357948-1-1.html 上篇帖子: php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 下篇帖子: 理解PHP中的MVC框架编程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表