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极大的增强功能和性能
Oct 09 PHP
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
php 远程关机操作的代码
Dec 05 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
thinkPHP简单遍历数组方法分析
May 16 PHP
php 流程控制switch的简单实例
Jun 07 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
laravel添加前台跳转成功页面示例
Oct 22 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网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
学习ExtJS TextField常用方法
2009/10/07 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
js跳转页面方法总结
2014/01/29 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
python http基本验证方法
2018/12/26 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
四风问题个人剖析材料
2014/10/07 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
内勤岗位职责
2015/02/10 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
辛亥革命观后感
2015/06/02 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书