关于Apache默认编码错误 导致网站乱码的解决方案(关于apache默认编码错误 导致网站乱码的解决方案)

关于Apache默认编码错误 导致网站乱码的解决方案(关于apache默认编码错误 导致网站乱码的解决方案)

扫码添加渲大师小管家,免费领取渲染插件、素材、模型、教程合集大礼包!

最近经常有同学在使用LAMP/WAMP时。遇到这样的编码错误问题:

A网站程序编码UTF-8编码安装成功。运行成功。

B网站程序编gb2312也要安装在同一服务器上。

这样就出现问题了。Apache默认编码UTF-8在解析A网站的时候没有任何问题。当运行B网站时出现的"蝌蚪文"乱码问题。

单纯的修改Apache默认编码为gb2312这样就导致A网站出现"蝌蚪文"。

问题分析:

如果你在网上搜索 “apache配置”。搜到的页面大多都会建议你在httpd.conf中加上这么一句:AddDefaultCharset GB2312。

对于新手而且是只用GB2312编码的开发人来说。这么做是ok的。但是如果要想使用UTF-8字符集的话。比如 在test.php文件中需要有 meta http-equiv="Content-Type" content="text/html; charset=UTF-8" 这段代码。

这时你再打开浏览器访问test.php页面的话。你看到的是正确的页面。但是如果实际上浏览器还是以GB2312编码解释从服务器返回的response。为什么呢?原因是浏览器是根据http应答消息头部中的 Content-type: text/html; charset=GB2312 来决定使用何种编码解释应答。也就是说apache服务器仍然用GB2312编码传递数据。

所以说如果apache的默认字符集被设置成了GB2312。即使在页面中声明使用UTF-8编码。apache服务器还是会按照GB2312编码来传送http response。没关系。我们把AddDefaultCharset GB2312 改成 AddDefaultCharset UTF-8。看看什么结果?

如果你看到乱码恭喜你。你还知道是乱码问题;如果你看到是空白页面。那么你就惨了。你可能会以为这是其他什么原因造成的。而不会从编码的角度去考虑怎么解决问题。这是为什么?原因在于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自动识别文件的编码方式。

这样不论你用什么编码方式。只要test.php中的meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ 与你test.php文件编码方式相同。就不会产生乱码问题。用户提交数据的编码浏览器提交的字符编码由客户端的characher encoding决定。

例如。当前浏览器的编码是Gb2312。用户提交数据后。无论apache设置的编码方式是GB2312还是UTF-8。这时在服务器端接收到的仍是以Gb2312编码的数据。

如果要在返回页面上显示用户刚才提交的数据。而该页面是用UTF-8编码的或者要在数据库中存储的用户提交的数据。而数据库是UTF-8编码的。那就要做字符转换了。

分享到 :
相关推荐

美国不限流量虚拟主机怎么样(美国不限流量虚拟主机怎么样了)

  对于熟悉美国虚拟主机的朋友都知道。美国虚拟主机不仅价格较便宜。资源配置较高外。其...

香港代理服务器IP使用注意事项(香港代理服务器ip使用注意事项)

最近很多客户都来问。香港代理服务器IP是什么?怎么使用?小编特意整理了一些关于香港代...

域名转入Godaddy图解(godaddy域名转入)

一。登录Godaddy官网。鼠标点击”allproduct&rdquo[...

美国服务器遭遇CC攻击有哪些影响(美国服务器遭遇cc攻击有哪些影响)

美国服务器遭遇CC攻击的影响:1。美国服务器的网络资源会被占用。使服务器资源耗尽无法...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注