PHP与MySQL开发中页面出现乱码的一种解决方法


Posted in PHP onJuly 29, 2007

一般来说,乱码的出现有2种原因,首先是由于编码(charset)设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的“天书”,其次是文件被以错误的编码打开,然后保存,比如一个文本文件原先是GB2312编码的,却以UTF-8编码打开再保存。要解决上述乱码问题,首先需要知道开发中哪些环节涉及到了编码:

1、文件编码:指的是页面文件(.html,.php等)本身是以何种编码来保存的。记事本和Dreamweaver在打开页面时候会自动识别文件编码因而不太会出问题。而ZendStudio却不会自动识别编码,它只会根据首选项的配置固定以某种编码打开文件,如果工作时候一不注意,用错误编码打开文件,做了修改之后一保存,乱码就出现了(我深有体会)。

2、页面申明编码:在HTML代码HEAD里面,可以用<meta http-equiv="Content-Type" content="text/html; charset="XXX" />来告诉浏览器网页采用了什么编码,目前中文网站开发中XXX主要用的是GB2312和UTF-8两种编码。

3、数据库连接编码:指的是进行数据库操作时候以哪种编码与数据库传输数据,这里需要注意的是不要与数据库本身的编码混淆,比如MySQL内部默认是latin1编码,也就是说Mysql是以latin1编码来存储数据,以其他编码传输给Mysql的数据会被转换成latin1编码。

知道了WEB开发中哪些地方涉及到了编码,也就知道了乱码产生的原因:上述3项编码设置不一致,由于各种编码绝大部分是兼容ASCII的,所以英文符号不会出现,中文就倒霉了。下面是一些常见的错误情况与解决:

1、数据库采用UTF8编码,而页面申明编码是GB2312,这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是乱码,需要在查询前先使用:

mysql_query("SET NAMES GBK"); 来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展)。如果页面是UTF-8编码的话,可以用:
mysql_query("SET NAMES UTF8"); 注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。
注:事实上MYSQL的数据输入输出比上面讲的更复杂一些,MYSQL配置文件my.ini中定义了2个默认编码,分别是[client]里的default-character-set和[mysqld]里的default-character-set来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么编码的,而不是采用默认编码。

2、页面申明编码与文件本身编码不一致,这种情况很少发生,因为如果编码不一致美工做页面时候在浏览器看到的就是乱码了。更多时候是发布以后修改一些小BUG,以错误编码打开页面然后保存导致的。或者是用某些FTP软件直接在线修改文件,比如CuteFTP,由于软件编码配置错误而导致转换错了编码。

3、一些租用虚拟主机的朋友,明明上述3项编码都设置正确了还是有乱码。比方说网页是GB2312编码的,IE等浏览器打开却总是识别成UTF-8,网页HEAD里面已经申明是GB2312了,手动修改浏览器编码为GB2312后页面显示正常。产生原因是服务器Apache设定了服务器全局的默认编码,在httpd.conf里面加了AddDefaultCharset UTF-8。这时候服务器会首先发送HTTP头给浏览器,其优先级比页面里申明编码高,自然浏览器就识别错了。解决办法有2个,请管理员在配置文件自己的虚机里加上一条AddDefaultCharset GB2312来覆盖全局配置,或者在自己目录的.htaccess里配置。

2006.4.4后注:感谢JunChen告知:在HTML页面HEAD区里,<meta http-equiv="Content-Type" content="text/html; charset="XXX" />这句一定要写在<title>XXX</title>前面,否则会导致页面一片空白(仅限IE+PHP)。

以上是我前些时间工作中遇到问题的总结与经验,如有错误,欢迎指正!

PHP 相关文章推荐
PHP5中MVC结构学习
Oct 09 PHP
20个PHP常用类库小结
Sep 11 PHP
迅速确定php多维数组的深度的方法
Jan 07 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
typecho插件编写教程(一):Hello World
May 28 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 PHP
php实现微信和支付宝支付的示例代码
Aug 11 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 PHP
真正的ZIP文件操作类(php)
Jul 21 #PHP
php 用sock技术发送邮件的函数
Jul 21 #PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 #PHP
在普通HTTP上安全地传输密码
Jul 21 #PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
Jul 21 #PHP
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 #PHP
一段php加密解密的代码
Jul 16 #PHP
You might like
php操作SVN版本服务器类代码
2011/11/27 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
node-red File读取好保存实例讲解
2019/09/11 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
详解Python中DOM方法的动态性
2015/04/11 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
python全栈知识点总结
2019/07/01 Python
flask应用部署到服务器的方法
2019/07/12 Python
python 实现任务管理清单案例
2020/04/25 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
主管职责范文
2013/11/09 职场文书
水务局局长岗位职责
2013/11/28 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
行政管理专业求职信
2014/07/06 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
java调用Restful接口的三种方法
2021/08/23 Java/Android
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android