`
txf2004
  • 浏览: 6973889 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PHP 字符集编码问题

阅读更多

几乎每个刚开始用 PHP 和 mySQL 开发 Web 应用的人,都受到过编码问题的困扰。要么页面原始汉字和从数据库里取出的汉字全是乱码;要么原始汉字和数据库汉字,一个显示正常了,另一个就变成乱码了。很烦很气人!

问题需要一步一步的解决。在实际操作以下方法之前,需要配置 Web 服务器,使其与 PHP 集成,最终可以调试 PHP 程序。我们以常见的 GB2312 和 UTF-8 字符集为例来测试和说明。浏览器是 IE7.0。

一,页面原始汉字乱码的解决

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

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

<Html>
<head>
<title>页面标题</title>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
</head>
<Body>
电脑学习网:<br>
http://www.why100000.com
</body>
</html>

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

[Firefox 2.0 下显示正常。]

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

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

1.3 在该页面首部加语句

<?php
header("Content-Type:text/html;charset=utf-8");
?>

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

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

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

1.4 在该页面首部加语句

<?php
header("Content-Type:text/html;charset=GB2312");
?>

再次保存该页面文件,“格式”下拉框选择“UTF-8”,文件名为 test4.php。用 IE 打开网站里的该文件,奇怪:看到页面汉字显示正常,并不是预想到的乱码?!在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码仍然是 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 编程人员,主要关心与自己有关的因素就可以了,没必要成为字符集编码方面的专家。为了兼容目前流行的 IE 和 FF 浏览器,我们可以按照以下简单的方法处理我们的 PHP 代码:
1,页面的真正字符集与 META 标签指定的应该一致;
2,也可以使用 header("Content-Type:text/html;charset=xxx"); 语句指定字符集,但是不能与字符的真正字符集冲突,也不能与 META 标签冲突。(尽管根据测试结果表明,当 header() 和 META 冲突时,header() 比 META 指定的字符集更优先,因为根据 HttpWatch Basic 跟踪显示,header() 指定字符集后,IE 浏览器 Type 会明确的得到字符集指定。但是不能保证其它非主流浏览器也会这样。)
3,不能与数据库取回的字符的字符集冲突,否则页面会出现页面本身的汉字和数据库取回的汉字,全部乱码或部分乱码问题。

张庆(网眼)
电脑学习网:http://www.why100000.com
网眼视界:http://blog.why100000.com
2008-4-13

分享到:
评论

相关推荐

    DB2 GBK 字符集解决方案.zip

    - 当遇到GBK字符显示异常时,首先检查数据库、表、列的字符集设置,然后是应用程序的编码配置,最后是数据传输过程中的编码转换问题。 7. **升级与迁移** - 在进行DB2版本升级或数据库迁移时,必须考虑GBK字符集...

    php字符编码确定

    在探讨“PHP字符编码确定”这一主题时,我们需深入理解如何在PHP与MySQL环境中确保一致且正确的字符编码设置,这对于处理多语言内容、避免乱码以及确保数据完整性和正确显示至关重要。 ### PHP与MySQL字符编码的...

    PHP检查字符串是否是UTF8编码

    PHP检查字符串是否是UTF8编码(字符集)

    MYSQL字符集与乱码问题分析

    《MySQL字符集与乱码问题分析》一文深入探讨了字符编码的历史背景、技术细节以及在MySQL中的应用,尤其关注解决常见的乱码问题。本文将根据提供的内容摘要,详细阐述其中涉及的关键知识点。 ### 字符集背景知识 ##...

    oracle中英文字符集切换

    在Oracle数据库系统中,字符集是用来定义如何存储和显示字符的编码系统。Oracle支持多种字符集,包括中文和英文字符,以满足全球化的数据存储需求。然而,在处理包含多语言数据时,不同的字符集设置可能导致乱码问题...

    PHP 开发中的中文编码问题

    在PHP开发中,中文编码问题是一个常见的挑战,尤其是在涉及数据库存储和页面展示时。这个问题的核心在于字符编码的不一致和转换不当。不同的编码标准,如ASCII、GB2312、GBK、UTF-8等,都有其特定的适用场景和规则。...

    linux下设置mysql字符集为UTF-8以及mysql重启.docx

    需要注意的是,为了确保整个系统的字符集一致性,还需要确保应用程序(如PHP、Java等)连接MySQL时也指定使用UTF-8字符集。 总结一下,设置Linux下MySQL字符集为UTF-8主要包含以下几个步骤: 1. 找到`my.cnf`配置...

    字符集转换程序ChChar_jb51

    字符集转换程序ChChar_jb51,作为一款专用于处理字符编码问题的小程序,帮助用户解决不同编码格式之间的兼容性和转换问题。本文将详细阐述该程序的核心功能、工作原理以及如何运用。 1. **字符集与编码** - 字符集...

    zxing.java源码解析-Specialsymbols:一些字符集编码资料收集

    一些字符集编码资料收集 unicode码钱128位为ASCII码,java中可以通过 int offset = 0; String name = “@”; int codePoint = Character.codePointAt(name, offset); codePoint 等于 64 该篇对字符集编码及java开发...

    php字符集转换

    PHP通过iconv将字符串从GBK转换为UTF8字符集。 1. iconv()介绍 iconv函数可以将一种已知的字符集文件转换成另一种已知的字符集文件。例如:从GB2312转换为UTF-8。 iconv函数在php5中内置,GB字符集默认打开。 2. ...

    字符串处理类:将GBK,UTF8字符串转化为Unicode编码的php类库.zip

    在PHP编程中,字符串处理是常见的任务之一,尤其是在处理不同编码格式的数据时。这个压缩包提供的类库专门用于处理GBK和UTF8编码的...正确理解和使用这个类库,能提高你的代码在处理字符串编码问题上的效率和准确性。

    仿淘宝,拍拍等查询关键词字符串编码算法实现(PHP版)

    字符串编码通常涉及到字符集(如ASCII、UTF-8)和编码方式(如URL编码、Base64编码)。在电商搜索场景下,编码的主要目的是对关键词进行规范化,去除或转换不必要的字符,以及确保关键词能在URL中安全传输。 PHP版...

    PHP教学中的乱码问题及解决方法.pdf

    可以通过设置正确的字符集、编码方案、HTTP 响应报文格式等方式来解决乱码问题。此外,还可以使用 Unicode 字符集标准、UTF-8 编码方案等来确保字符的正确显示。 四、结论 乱码问题是 PHP 教学中的常见问题,影响...

    PHP编码转换函数 自动转换字符集支持数组转换

    在PHP编程中,字符编码转换是一个常见的需求,特别是在处理用户输入数据时,因为不同的系统和浏览器可能使用不同的字符集。`auto_charset`函数是解决这个问题的一个实用工具,它能够自动将给定的内容从一种编码转换...

    php 编码相互转换类(gbk转换utf8)

    在IT行业中,编码转换是一个常见的需求,特别是在处理中文字符时。GBK和UTF-8是两种广泛使用的字符...总的来说,这个编码转换类对于处理中文字符集的PHP项目来说是一个有价值的工具,能够提高代码的健壮性和兼容性。

    挪威字符集设置(服务器和客户端)

    4. **文件编码**:服务器上的HTML、CSS、JavaScript和其他文本文件应以UTF-8无BOM格式保存,以避免编码问题。 **客户端设置:** 1. **浏览器设置**:大多数现代浏览器默认使用UTF-8作为其首选字符集,但用户也可以...

    PHP字符编码问题之GB2312 VS UTF-8解决方法

    本文主要讨论了PHP中遇到的字符编码问题,特别是GB2312和UTF-8编码之间的转换和适配。 GB2312是中国大陆早期广泛使用的简体中文编码标准,它能表示大约7000多个常用汉字。而UTF-8是一种变长的Unicode编码,它可以...

    以utf8格式截取的字符串编码

    在进行字符串截取操作时,选择适当且支持多字节的函数,确保文件和输出的编码一致,这些都是避免编码问题的关键。在提供的`test.php`文件中,很可能包含了使用`mb_strcut`或其他类似函数处理UTF-8字符串的示例代码,...

    mysql+php乱码编码配置修改方案(非常详细纯原创)

    在PHP与MySQL结合开发Web应用时,乱码问题是一个常见的困扰。...当然,现代的Web开发中,UTF-8编码已成为标准,建议尽可能使用UTF-8以支持更多语言和字符集,但此解决方案对处理GBK编码的遗留问题仍然有参考价值。

    php页面各种编码设置_.docx

    根据提供的文档信息,本文...通过上述详细的介绍和示例代码,我们可以看出,在开发基于 PHP 的 Web 应用程序时,合理地设置和管理字符集编码是非常重要的,它可以有效避免乱码等问题的发生,确保数据的一致性和正确性。

Global site tag (gtag.js) - Google Analytics