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 相关文章推荐
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
Jun 06 PHP
解析zend Framework如何自动加载类
Jun 28 PHP
php实现天干地支计算器示例
Mar 14 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
php使用scandir()函数扫描指定目录下所有文件示例
Jun 08 PHP
PHP实现的文件浏览器功能简单示例
Sep 12 PHP
laravel返回统一格式错误码问题
Nov 04 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高级对象构建 多个构造函数的使用
2012/02/05 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
python实现用户答题功能
2018/01/17 Python
Python切片操作实例分析
2018/03/16 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
Python3常用内置方法代码实例
2019/11/18 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
自我鉴定 电子商务专业
2014/01/30 职场文书
森林防火工作方案
2014/02/14 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
组工干部对照检查材料
2014/08/25 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
Python常遇到的错误和异常
2021/11/02 Python
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS