Rumah >pembangunan bahagian belakang >tutorial php >PHP字符集编码出现乱码的解决办法_PHP教程

PHP字符集编码出现乱码的解决办法_PHP教程

WBOY
WBOYasal
2016-07-15 13:30:35960semak imbas

要么页面原始汉字和从数据库里取出的汉字全是乱码;要么原始汉字和数据库汉字,一个显示正常了,另一个就变成乱码了。很烦很气人! 问题需要一步一步的解决。在实际操作以下方法之前,需要配置 Web 服务器,使其与 PHP 集成,最终可以调试 PHP 程序。我们以常见的 GB2312 和 UTF-8 字符集为例来测试和说明。浏览器是 IE7.0。

页面原始汉字乱码的解决

PHP字符集编码的原理我就不说了,网上搜索一下字符串“PHP 乱码”,整框整框的文章供大家阅读。我最关心的是具体怎么做,就可以解决这个实际问题。我最喜欢使用的文本编辑器是 UltraEdit,不仅仅因为它可以进行 16 进制编辑,还因为它支持多编码文档。解决这个问题就需要使用 UltraEdit 的这个功能。

打开中文 Windows,用 UltraEdit 创建一个文本文件,手工输入一个 PHP 页面文件,文件内容如下。保存为 test1.php 文件,注意保存时“格式”下拉框选择“默认”- 特别注意这里。

<ol class="dp-xml"><li class="alt"><span><span class="tag"><span> </span><span class="tag-name">Html</span><span class="tag">></span><span> </span></span><li><span class="tag"><span> </span><span class="tag-name">head</span><span class="tag">></span><span> </span><li class="alt"><span class="tag"><span> </span><span class="tag-name">title</span><span class="tag">></span><span>页面标题</span><span class="tag"><span> /title</span><span class="tag">></span><span> </span><li><span class="tag"><span> </span><span class="tag-name">META</span><span> </span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">Content</span><span>-Type </span><span class="attribute">content</span><span>=</span><span class="attribute-value">"text/html; charset=gb2312"</span><span class="tag">></span><span> </span><li class="alt"><span class="tag"><span> /head</span><span class="tag">></span><span> </span><li><span class="tag"><span> </span><span class="tag-name">Body</span><span class="tag">></span><span> </span><li class="alt">
<span>电脑学习网:</span><span class="tag"><span> </span><span class="tag-name">br</span><span class="tag">></span><span> </span><li><span class="tag"><span> /body</span><span class="tag">></span><span> </span><li class="alt"><span class="tag"><span> /html</span><span class="tag">></span><span> </span></span></li></span></li></span>
</li></span></li></span></li></span></li></span></span></li></span></li></span></li></ol>

用 IE 浏览器打开网站的这一页面。可以看到,页面显示正常。在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 GB2312。

[Firefox 2.0 下显示正常。]

然后,在 UltraEdit 的“文件”菜单下,选“另存为”,格式选择“UTF-8”,文件名为 test2.php。用 IE 浏览器打开这一页面。可以看到,页面显示正常(其实英文字体已经有略微的变化了)。在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 UTF-8,自动变了!注意 一句并没有修改,但是浏览器却自动辨别出了真实的PHP字符集编码!看来 IE 还是比较聪明的,也说明 IE 自动判别字符集是比 METE 标签中 charset=xxx 的定义优先的。

[Firefox 2.0 下显示出现乱码。]

在该页面首部加语句

<ol class="dp-xml">
<li class="alt"><span><span class="tag"></span><span class="tag-name">php</span><span> </span></span></li>
<li><span>header("Content-Type:text/html;</span></li>
<li>
<span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8");  </span>
</li>
<li class="alt">
<span class="tag">?></span><span> </span>
</li>
</ol>

再次保存该页面文件,“格式”下拉框选择“默认”,文件名为 test3.php。用 IE 打开网站里的该文件,这次看到,除过英文字母,汉字变成乱码了!同时在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 UTF-8,已经被强制改变了。

出现汉字乱码的原因,是因为原本的 GB2312 编码,被强制以 UTF-8 的编码形式显示,所以乱码出现了。这个时候在浏览器里人为指定 GB2312 编码,页面汉字又显示正常了(真正制作页面时是不能这么做的,非要让浏览者自己选择PHP字符集编码,一个是浏览者可能根本不知道怎么选择编码、选什么编码,再者也显得我们太菜了!)。

[Firefox 2.0 下显示出现乱码。]

在该页面首部加语句

<ol class="dp-xml"><li class="alt"><span><span class="tag"><span> ?php  </span></span><li><span>header("Content-Type:text/html;</span></li>
<li>
<span class="attribute">charset</span><span>=</span><span class="attribute-value">GB2312</span><span>");  </span>
</li>
<li class="alt">
<span class="tag">?></span><span> </span>
</li></span></li></ol>

再次保存该页面文件,“格式”下拉框选择“UTF-8”,文件名为 test4.php。用 IE 打开网站里的该文件,奇怪:看到页面汉字显示正常,并不是预想到的乱码?!在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),PHP字符集编码仍然是 UTF-8,并没有被强制改变了 GB2312 字符集。

这个时候在浏览器里人为指定 GB2312 编码,发现 IE 浏览器并不能人为指定编码。看来 IE 浏览器对 UTF-8 字符集特别关照。无论是在 META 标签指定,还是 PHP 语句指定,都不能让 IE 浏览器显示出汉字乱码。

[Firefox 2.0 下显示出现乱码。]

小结一下: 以上测试主要在 IE7.0 下进行,Web 服务器为 Windows Server 2003 下的 IIS6.0,PHP 版本为 4.4.7。可以看到,IE7.0 为了正确识别字符集做了很多额外的自动处理的工作,以显示其智能和友好。有时太殷勤了反而使我们不知所措。由于汉字乱码问题与不同的浏览器及其不同的版本、Web 服务器、后台脚本和不同的字符集都有点关系,所以问题显得特别复杂。作为 Web 编程人员,主要关心与自己有关的因素就可以了,没必要成为PHP字符集编码的专家。为了兼容目前流行的 IE 和 FF 浏览器,我们可以按照以下简单的方法处理我们的 PHP 代码:

1,页面的真正字符集与 META 标签指定的应该一致;

2,也可以使用 header("Content-Type:text/html;charset=xxx"); 语句指定字符集,但是不能与字符的真正字符集冲突,也不能与 META 标签冲突。(尽管根据测试结果表明,当 header() 和 META 冲突时,header() 比 META 指定的字符集更优先,因为根据 HttpWatch Basic 跟踪显示,header() 指定字符集后,IE 浏览器 Type 会明确的得到字符集指定。但是不能保证其它非主流浏览器也会这样。)

3,PHP字符集编码不能与数据库取回的字符的字符集冲突,否则页面会出现页面本身的汉字和数据库取回的汉字,全部乱码或部分乱码问题。


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/446271.htmlTechArticle要么页面原始汉字和从数据库里取出的汉字全是乱码;要么原始汉字和数据库汉字,一个显示正常了,另一个就变成乱码了。很烦很气人!...
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn