`
mugicoffee
  • 浏览: 37502 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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了……

 
 
分享到:
评论

相关推荐

    php从数据库中读取数据生成xml

    这一步很重要,因为如果字符集不匹配,可能会导致中文乱码的问题。 #### 三、生成XML头部信息 - **XML声明**: - `echo "<?xml version='1.0' encoding='utf-8'?>";`: 输出XML文档的声明部分,指定版本号为1.0,并...

    PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案

    通过指定正确的编码或者在保存前进行编码转换,可以确保中文字符在XML文档中正常显示。希望这些信息对您有所帮助,如果您在实践中遇到其他问题,欢迎继续提问。感谢您对我们网站的支持,我们将持续提供更多的技术...

    用PHP与XML联手进行网站编程

    4. **多字节字符支持不足**:HTML在不同平台上显示中文等多字节字符时容易出现问题,降低了用户体验。 #### XML的关键技术及优势 **1. DTD(Document Type Definition,文档类型定义)** - 功能:定义XML文档的...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    这是一个质的区别:网页将数据和显示混在一起,而XML则将数据和显示分开来。 我们看上面的例子,在myfile.htm中,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但数据是储存在...

    xml.rar_xml

    通过对比en.xml(英语)和zh.xml(中文),我们可以学习如何组织和维护多语言应用。 4. **employee.xml**:这是一个可能包含员工数据的XML文件。它展示了如何使用XML来表示复杂的数据结构,例如员工的姓名、职位、...

    php的webservice的wsdl的XML无法显示问题的解决方法

    本文将详细讨论PHP中的Web Service以及遇到的WSDL(Web Service Description Language)XML无法显示问题的解决方法。 首先,让我们了解什么是WSDL。WSDL是一种XML格式的规范,用于描述Web服务及其接口,包括服务的...

    PHP100视频教程全集112集BT种子【PHP经典】

    PHP100视频教程59:关于BIWEB常见问题和结构分析 PHP100视频教程60:PHP与数据库代码开发规范 PHP100视频教程61:PHP+Mysql新闻系统的开发一 PHP100视频教程62:PHP+Mysql新闻系统的开发二 PHP100视频教程63:...

    PHP处理数组和XML之间的互相转换

    总而言之,PHP在处理数组与XML格式数据的转换上提供了多种工具和方法,从简单的遍历数组到构建复杂的DOM结构,再到处理中文乱码问题,都显得游刃有余。通过掌握这些技能,开发者可以更高效地完成数据格式转换任务,...

    PHP函数库,PHP函数大全,PHP函数实例,PHP函数手册,PHP5函数库实例

    GD显示中文 PHP GIF动画生成类 PHP HTML转UBB函数 PHP XML转数组函数 PHP 缓存函数 PHP 设置COOKIE,并且加密COOKIE函数 PHP不缓存数据头 PHP伪造IP PHP全角半角转换函数 PHP农历函数 PHP分页函数 PHP...

    php5中文手册完整版

    XML处理,包括DOM、SimpleXML和XMLWriter;以及FTP、邮件和网络相关函数,支持服务器端的各种交互。 《PHP5中文手册》详尽地介绍了这些内容,包括每个函数的参数、返回值和使用示例,帮助开发者快速上手并深入理解...

    PHP5最新中文手册2012年

    《PHP5最新中文手册2012年》是2012年度官方发布的PHP中文文档,对于学习和掌握PHP5编程语言的开发者来说,是一份非常重要的参考资料。这份手册详尽地介绍了PHP5的各项功能、语法特性以及使用方法,帮助程序员在实际...

    PHP实现动态添加XML中数据的方法

    为了处理中文字符,这里使用了`iconv`函数将字符串从GB2312编码转换为UTF-8编码,以确保正确地编码XML文件。 在创建这些元素后,它们被添加到新的`<record>`元素中,然后将`<record>`元素添加到XML文档的根元素`...

    flash+xml投票程序

    Flash作为一个流行的富互联网应用程序(Rich Internet Application,RIA)开发平台,以其丰富的图形表现和用户交互性著称,而XML则是一种轻量级的数据存储和传输格式,适合于在不同应用程序之间交换数据。...

    php操作xml并将其插入数据库的实现方法

    从给定的文件信息中,我们可以了解到如何使用PHP语言操作XML数据,并将这些数据插入到...在实际应用中,需要注意PHP版本更新带来的函数变动、XML文件解析的安全性和效率问题,以及数据库操作中的错误处理和安全防护。

    php5中文手册chm版

    8. **XML处理**:PHP5包含了一系列处理XML的函数,如DOM、SimpleXML和XMLReader,便于解析和生成XML文档。 9. ** Sessions和Cookies**:用于在用户之间持久保存数据,`session_start()`启动会话,`$_SESSION`数组...

    xml jdk1.6 jquery mysql API

    XML的设计目标是传输和存储数据,而不是显示数据,这使得它成为不同系统之间交换结构化数据的理想选择。在XML文档中,数据以自定义的标签形式存在,允许用户创建符合自己需求的数据表示。 JDK 1.6是Java ...

    PHP 5.2中文手册

    PHP 5.2的GD库支持图像处理,可以创建、修改和显示各种图像格式,如JPEG、PNG、GIF等。 十二、面向服务架构(SOA) PHP 5.2支持SOAP客户端和服务器,允许与其他平台通过Web服务进行交互。 这份"PHP 5.2中文手册...

    解决Flex 中文乱码

    在开发Flex应用程序时,我们经常会遇到中文乱码的问题,这主要源于AS3(ActionScript 3)和服务器之间编码不一致导致的。Flex是Adobe推出的一款用于构建富互联网应用程序(RIA)的框架,其核心编程语言是AS3。在处理...

Global site tag (gtag.js) - Google Analytics