`
xuepengcheng
  • 浏览: 45283 次
  • 性别: Icon_minigender_1
  • 来自: 郴州
社区版块
存档分类
最新评论

PHP碥码问题.

    博客分类:
  • PHP
阅读更多
这问题开始开来于页面编辑工具上,后来又深入到服务器的配置中。
   Macromedia Dreamweaver与Aptana RedRails 是我编写PHPWEB服务器的两个工具。用的还不错,开始这两个并用时并没有发生什么乱码之事,后来试用Aptana这工具时就发生一些意外了。在Aptana编写到Dreamweaver中看是乱,反之同效果。查看Aptana编码设置为UTF-8而Dreamweaver是gb2312。晕问题在这里,统一UTF-8。
   还以为OK了,在测试时又发生了乱码,原有过一点JSP编码的经验所以也就想到了源头PHP的设置。浏览器是根据http应答消息头部中的 Content-type: text/html; charset=xxx 来决定使用何种编码(xxx)解释应答。如果浏览器是以UTF-8应答时想来apache服务器是用UTF-8来传递数据。同理。
页面编写设置为<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />的PHP文件,浏览器访问它时解释应答确是以gb2312的方式产生了页面乱码,原因在于php文件本身是用系统字符集来编码的,中文的windows XP都是用GB2312,当apache接到浏览器的请求后,会让php去解释所请求的页面,比如 test.php。php会识别出test.php的编码方式是GB2312后(就像我们用javac编译java源文件时,编译器默认用系统编码读源文 件里的内容。如果源文件不是用系统编码来保存的,可以用命令javac -encoding指定具体的编码),把数据以GB2312的编码格式传递给apache,而apache服务器不会改变从php传来的数据,只是在应答 消息头部中把字符集设置成UTF-8: Content-type: text/html; charset=UTF-8. 也就是说你传递的是GB2312编码的数据,而浏览器却以UTF-8编码来解释应答消息。

由 于UTF-8为3个字节表示一个汉子,而普通的GB2312或BIG5是两个。页面输出时,由于上述原因,出现半个汉字的情况,这时该半个汉字会和的 >结合成一个乱码字,导致IE无法读完的话,会发现实际上整个叶面全部已经输出了。如果使用的是Mozilla、Mozilla Firefox、Sarafi的浏览器这不会造成这个问题,而是一堆乱码。这是由于Firefox浏览器和IE解析网页编码的策略不同产生的。

OK,我们把test.php以UTF-8保存,再用浏览器访问时,就没有问题了。可这样做,会使得apache目录下的所有web应用只能用同一种编码。如何搞定?

解决办法:

首先,可以使用AddDefaultCharset off来 关闭默认文件编码,这样apache服务器就不会在http应答消息头部设置charset,只是设置Content-type: text/html. 而浏览器就会依靠html文件中设置的harset来决定编码。其次,脚本php.ini文件中的default_charset = “UTF-8″作用同httpd.conf文件,把该行注释掉,使php自动识别文件的编码方式。

用户提交数据的编码

浏 览器提交的字符编码由客户端的characher encoding决定。例如,当前浏览器的编码是Gb2312,用户提交数据后,无论apache设置的编码方式是GB2312还是UTF-8,这时在服 务器端接收到的仍是以Gb2312编码的数据。如果要在返回页面上显示用户刚才提交的数据,而该页面是用UTF-8编码,或者要在数据库中存储的用户提交 的数据,而数据库是UTF-8编码的,那就要做字符转换了。

注意:
   有看到吗刚才我两个编写工具都使用UTF-8来编辑代码的,当我使用Dreamweaver+gb2312时编写如上办法可解决,使用UTF-8来编辑代码要有所改动default_charset = “UTF-8“,OK解决。AddDefaultCharset这东西好像在我这没用Apache2.2我用的是这个版本。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics