PHP环境下utf8乱码的解决方法---apache,php配置问题
在PHP
程序中加上 ini_set('default_charset','utf-8');
将包含unicode码的文件统一转换成utf8格式,这里需要注意的是editplus保存的utf8文件不带BOM头,
这在大多数情况下不会有什么问题,而在模板输出时会有乱码现象,除了检查模板文件中utf8的标记之外,利用editplus来保存模板时没有BOM头也是一个原因,原因在于模板解析时,
PHP读取文件时,没有检查到BOM头,会把该文件当成ansi格式处理,这样最终向浏览器输出的HTML就成了乱码。
另一篇文章:
我的页面代码如下
[Copy to clipboard] [ - ]CODE:<
HTMLXMLNS="W3.ORG xhtml? 1999>
NET gl.gif? border="0" ?image />&;#44288;&;#47532;&;#49468;&;#53552; 编码选择utf-8,但是打开时ie自动选择的却是gb2312出现乱码,在DW里我选取择"包括Unicode签名(BOM)"后,ie自动选择utf8就不会出现乱码,我不想使用BOM,因为使用BOM后,session又会提示警告。大家说应该怎么办呢?
先去除 BOM。然后再加入:
[Copy to clipboard] [ - ]CODE:header('Content-Type: text/html; charset=UTF-8');
即可。
httpd.conf
AddDefaultCharset GB2312
PHP.INI
default_charset = "gb2312 "
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果你在网上
搜索 “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 改成 AddDefau
ltCharset 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编码的数据,而浏览器