Apache 中文乱码解决方案
服务器端:
======
修改httpd.conf (在Redhat中放置的位置为/etc/httpd/conf/)
查找:
AddDefaultCharset ISO-8859-1
改为:
#AddDefaultCharset ISO-8859-1
AddDefaultCharset off
这种方式关掉了服务器的默认语言的发送,这样仅凭html文件头中设置的语言来决定网页语言。
不少文章都说经过修改成 AddDefaultCharset GB2312 把缺省语言改为GB2312来解决中文乱码,确实GB2312内码的网页能够正常显示了,但这并不是万全之策。由于当你的网页内码不是GB2312,就算你在网页用下面的meta指定了正确的语言,如ISO8859-1,也不会解码为ISO8859-1,由于Apache已经先你一步将GB2312指定为网页的语言了,以下图:
而这个是加了 AddDefaultCharset off 后的:
修改后请从新启动Apache,在Redhat中命令为
/etc/init.d/httpd restart
当使用一些网页脚本引擎,如PHP,还可能须要修改相应的配置文件。
以PHP为例,须要修改php.ini (Red Hat中位置在/etc/)
找到:
default_charset = “iso-8859-1″ 或者相似的,如 default_charset = “gb2312″,将其注释掉:
;default_charset=”iso-8859-1″
客户端:
=====
在中文网页请中依状况在标签中添加:
GB2312:
<META http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
BIG5:
<META http-equiv=”Content-Type” content=”text/html; charset=big5″ />
UTF-8: (注意是UTF-8,而不是UTF8,我已经上过当了)
<META http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
若是仍是不正常,请清空浏览器的Cache试试。
另外附上goghs的”blog工具中中文的问题“一文的修正版,这篇文章很好的阐述了Charset和Encoding之间的关系。
blog工具中中文的问题 [Blog] - goghs @ 23:26:56
如今的blog工具彻底中文的并无,而通常程序的默认,都是使用iso8859-1字符集,或者说en语言编码。字符集(Charset)和编码(Encoding)是两个不一样的概念。
若是你使用MT的默认安装,或者使用B2的默认安装,你会发现你所发布的中文文章根本没法正常显示。(此处的MT的默认安装,以使用MySQL为基准,使用文件的我没有测试,不便评述。)
缘由很简单,全部页面的默认都是iso8859-1字符集,因此在数据插入数据库的时候,都会被编码(成为html实体,如xxx;类型,xxxx此处都是数字)。
处理的方式并不复杂,对MT而言,你须要将mt.cfg中的NoHTMLEntities以行前面的注释符号去掉,变成
NoHTMLEntities 1
一次来禁止使用HTML::Entities进行实体编码。
而后修改CGI.pm中的一处,设置为正确的gb2312字符集,我在前面的一篇文章中已经谈到。
而且须要修改全部的模板,将其中的charset从iso8859-1修改成gb2312。
而对B2,B2config.php里, 第91行有
# IMPORTANT! set this to 0 if you are using Chinese, Japanese, Korean,
#or other double-bytes languages
$use_htmltrans = 0;
把$use_htmltrans 设定成0就好了。
编码问题还牵涉到生成的RSS文件。做为XML的一个词聚集(此处翻译成中文彷佛很让人搞不清楚,也许直接用Vocabulary更好一点),RSS彻底须要遵循XML规范。
全部的数据中,有5个字符必须进行特殊处理。它们是单引号(’), 双引号(”), 小于号(< ),大于号(>),以及&,由于他们具备特殊的用处和意义。MT中Util模块(Util.pm)中的encode_html函数负责处理,而在PHP中使用htmlspecialchars()函数作的就是一样的工做(注意默认状况下单引号是不被处理的,你须要使用ENT_QUOTES做为第二个参数)。
对RSS的生成,你只须要使用上述的方法进行处理,就是处理掉5各特殊字符,而千万不要使用MT中的HTMLEntities和PHP中的 htmlentities()函数,由于这样它会将非iso8859-1的字符所有转换成实体,就是xxx;格式。对PHP,虽然4.1版本开始,虽然htmlspecialchars()函数能够经过第三个参数传递一个charset来进行处理,可是以个人简单测试,彷佛不行。
另外须要对RSS指定一个正确的encoding, 就是将默认的
<?xml version=”1.0″ encoding=”UTF-8″?>
修改成
<?xml version=”1.0″ encoding=”GB2312″?>
(XML这里确实比较糊涂,encoding使用charset)
关于语言代码和国际代码,有不少复杂的标准,我也没太搞清楚,这里就不说了。总之记住对简体中文,charset = gb2312 或者说更准确的应是 charset = GB2312, encoding = “zh”。其余的不知道也罢。
在rss生成中,只要你在前面制定了正确的charset, 即便你没有正确设置encoding,其源文件是彻底可读的,只是若是你使用浏览器进行浏览时,它会以UTF-8编码显示,所以中文是乱码,只有你正确制定了中文编码后,才能够正确显示(你也能够经过切换浏览器的编码来看)。
总之这是一个比较复杂的问题,个人能力有限,也只能解释道这一步了。
仓促中写就,可能有不少错误,请你们指正。php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~html
在配置文件中添加:数据库
IndexOptions Charset=GB2312浏览器
这样这样就能解决Apache autoindex模块中文乱码问题了。服务器