我们在做PHP项目的时候,经常会遇到中文乱码的问题,有时候编码问题还导致MYSQL的报错。中文乱码总共有三个原因

1:APACHE服务器设置导致乱码

2:PHP,或者HTML页面编码导致中文乱码

3:MYSQL数据库的表以及字段编码导致中文乱码

我们分别从这三个部分来探究PHP程序设计中的编码问题

在这之前我们要了解一些基本理论:

1、文件编码

每个文件在保存的时候都可以选择以什么编码保存,例如用WINDOWS的记事本创建一个文件可以选择ANSI 以及UTF8等等编码。我们选择了什么编码该文件就以这种编码方式保存在硬盘上。 读取该文件数据的时候也会指定一种编码来打开,如果指定的编码与文件保存的时候的编码不一样的话就会出现乱码

2、HTML的编码

在网页头部一般有这样一个<HEAD>区域

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
这个的意思是让客户端知道,接下来输出的是html代码(text/html),并且以下输出的内容都将是utf-8编码的。如果我们用记事本创建一个HTML文件 该文件包含

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

但是在保存的时候却以ANSI编码格式保存,那么我们用浏览器打开这个文件时,浏览器看见META 行的UTF8编码设置后 就将文件以UTF8格式输出,而文件本来是ANSI编码,这样便出现了中文乱码。

一:APACHE服务器编码

在APACHE配置文件中有一行是编码的设置 默认的是AddDefaultCharset ISO-8859-1,大部分人认为应该将这句改为 AddDefaultCharset UTF-8 。而蜗牛认为这是误人子弟。 这项配置是告诉APACHE服务器选用什么样的编码来输出WEB页面(这样做会忽略,HTML页面中的页面编码的设置 EG:<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />),如果我们建立一个GB2312的页面就会出现中文乱码 。所以最好的方法是将AddDefaultCharset ISO-8859-1这一项注释掉 #AddDefaultCharset

二:PHP编码问题

php最终生成的是文本文件,而他要从数据库中取出文本数据,还要把文本数据写到数据库中。由于MYSQL并不知道PHP发送给他的是什么编码的数据,所以需要客户端PHP告诉他存取的是什么编码的数据。然后MYSQL会自动将PHP传送来的数据转换成目标编码格式的数据。

比如: PHP要将 文本数据DATE 写入到数据库字段field中,PHP发送的是UTF-8编码的数据,而DATE是以GB2312方式存储的。这时候PHP通过设置告诉MYSQL 我发的是UTF-8格式,MYSQL接到数据后 说:”我知道了,来谁专门负责将UTF-8转换成GB2312“ 于是MYSQL中的一个专门负责此事的小兵跑来 把数据拿走经过加工放到指定位置,如果PHP误将UTF-8编码的数据 当作GB2312编码 送给MYSQL的时候,MYSQL会叫上次那个负责UTF-8—-GB2312的小兵来负责,而小兵不管三七二十一按同样方法转换存起来,这就出现了错误,乱码就产生了。取数据的时候也一样,PHP要告诉MYSQL要取出什么样编码的数据。

PHP通过character_set_client告诉MYSQL,php存入数据库的是什么编码方式

PHP通过character_set_results告诉MYSQL,php需要取什么样编码的数据

PHP通过character_set_connection告诉MYSQL,PHP查询中的文本,使用什么编码

就算上面的大家都注意了,还有个问题也可能导致乱码。那就是PHP文件(生成的HTML页面)本身的编码问题

如果MYSQL传来的数据 编码与PHP本身编码不一致也会导致乱码

三:MYSQL编码问题

Mysql目前支持多字符集,并且,支持在不同的字符集之间转换(便于移植和支持多语言)。
Mysql可以设置服务器级字符集、数据库级字符集、数据表级字符集、表列的字符集,实际上,最终使用字符集的地方是存储字符的列,比如,你设置 table1中col1列是字符类型,col1才用到了字符集,如果table1表的col2列是int类型,col2不使用字符集的概念。
服务器级字符集、数据库级字符集、数据表级字符集都是为列的字符集做默认选项的。
Mysql一定有一个字符集,可以通过启动时加参数指定 ,也可以编译时指定,也可以在配置文件里指定。Mysql服务器字符集,只是做为数据库级的默认值。创建数据库时,你可以指定字符集,如果没指定,就使用服务器的字符集。同理,创建表时,你可以指定表级的字符集,如果没指定,使用数据库的字符集做为表的字符集。创建列时,你可以指定某列的字符集,如果没指定,就使用表的字符集。
通常情况下,您只需设置服务器级的字符集,其它的数据库级,表级,以及列级的字符集,都继承自服务器级字符集。
由于UTF8是最广的字符集,所以,一般情况下,我们设置Mysql服务器级的字符集为UTF8!

总结:

要保证不乱码,需将三个编码统一:

一:是网页自身的编码

二:是HTML里指定的编码

三:是PHP告诉Mysql的编码(包括character_set_client和character_set_results)。

第一和第二个编码,如果使用DW之类的编辑器写的网页,通常是一致的,但用记事本写的网页,有可能不一致。
第三个编码,需要手工通知Mysql。这步可以通过在PHP里使用mysql_query(“set names characterX”)来实现。

PHP中文乱码的三个原因及解决方法相关推荐

  1. 计算机换用户无法启动软件吗,电脑软件无法启动常见的三种原因以及解决方法...

    日常生活中,我们的电脑总会遇到各种各样的问题,掌握了修电脑的技能,会对我们有很大的帮助,至少出现问题的时候不会手忙脚乱,打乱我们的工作计划,或者花冤枉钱拿出去修,下面就给大家简单讲述电脑软件无法启动常 ...

  2. 计算机无法启动的原因及解决方法,电脑软件无法启动常见的三种原因以及解决方法...

    日常生活中,我们的电脑总会遇到各种各样的问题,掌握了修电脑的技能,会对我们有很大的帮助,至少出现问题的时候不会手忙脚乱,打乱我们的工作计划,或者花冤枉钱拿出去修,下面就给大家简单讲述电脑软件无法启动常 ...

  3. (转)Putty server refused our key的三种原因和解决方法

    (转)Putty server refused our key的三种原因和解决方法 参考文章: (1)(转)Putty server refused our key的三种原因和解决方法 (2)http ...

  4. win7计算机名怎么是感叹号,Win7连接wifi信号后出现感叹号三种原因和解决方法

    Win7系统电脑连接网络上网的方式有很多种,比如拨号.无线wifi.网卡等等,有时候网络也会出现故障问题.这不Win7连接wifi出现感叹号,并且提示有限的访问权限,且无法上网.有什么办法能解决,让w ...

  5. win7计算机名怎么是感叹号,Win7系统wifi信号后出现感叹号怎么办 Win7连接wifi后出现感叹号三种原因和解决方法...

    Win7连接wifi出现感叹号,并且提示有限的访问权限,且无法上网.有什么办法能解决,让win7系统能够正常连接网络呢?针对Win7连接wifi信号后出现感叹号的问题,下面脚本之家的小编给大家讲解具体 ...

  6. win10计算机休眠后无法唤醒,win10电脑休眠后唤不醒怎么回事_win10电脑休眠后唤不醒的三种原因和解决方法...

    win10系统进入休眠模式能节约电源和开机时间,如果长时间不用电脑,在不关机的情况下,可以让系统进入休眠模式,不仅节约能源,还保护设备.有时候也会出现一些问题,比如win10电脑休眠后唤不醒,移动鼠标 ...

  7. 计算机win7开机了进入不到桌面,win7开机不显示桌面怎么回事|win7开机不显示桌面三种原因和解决方法...

    一些win7系统用户在开机的时候发现电脑桌面不显示了,这样就没办法进行任何操作了,导致win7开机不显示桌面的原因有很多,为帮助大家能够快速解决问题,小编收集总结一些win7开机不显示桌面三种原因和解 ...

  8. matlab win8打不开了,win8打不开防火墙的三种原因和解决方法

    win8系统自带有防火墙功能,开启防火墙可以过滤不安全的服务而减低风险极大地提高内部网络的安全性.不过有win8系统用户说防火墙打不开,也不知道哪里出现问题了,其实导致win8打不开防火墙的原因有很多 ...

  9. CAD2018安装计算机黑屏,3dmax2018一打开就闪退的三种原因和解决方法

    3dmax2018一打开就闪退的原因是什么?3dmax可以说是每个设计师都需要频繁使用到的软件,如果无法正常运行,会干扰到工作的进度.有些时候,一打开3dmax2018版,就会出现黑屏,或者闪一下就关 ...

最新文章

  1. java image filters[02]-过滤器初探
  2. mysql创建数据库选择_mysql创建、选择并使用数据库
  3. 机器学习2021 | 机器学习算法如何商业落地?
  4. 3G网络关闭,4G还会远吗?
  5. 如何理解Generator
  6. Uncaught TypeError: Cannot read property 'value'' of null
  7. ./configure: error: the HTTP gzip module requires the zlib library.
  8. Outlook 阅读窗格(Reading Pane)
  9. unity3d 各个目录的意思
  10. sdut 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
  11. 单自由度振动全解:matlab理论计算 virtual.lab motion仿真Excite PU仿真
  12. Windows Embedded Standard 7 帮零售业快速抢占市场
  13. Vue3 配置代理和使用全局axios请求数据
  14. docker自定义网络
  15. java版本对应jdk版本_jdk版本对应数字
  16. Python反转链表
  17. Java中的其他常用类(Math类,Scanner类、正则表达式)
  18. 目标检测之单阶段和两阶段检测算法的对比
  19. 机器人三星云顶之弈_机器码|云顶之弈10.16三星机器人加强介绍-云顶之弈10.16三星机器人加强了吗_234游戏网...
  20. 吃货必须知道的经验,收藏备用了!太全面了!

热门文章

  1. 悲情的AI四小龙,背后不是专利无用
  2. 调频 调幅 与 通信
  3. Win7安装补丁KB2670838
  4. 妹子读者小墨:一文和你聊透数据可视化!
  5. linux lcd cd,linux LCD调试
  6. 屌丝程序员的2012
  7. 【学会轮播图这一篇文章就足够啦】JS 网页轮播图详解 自动播放+手动播放
  8. s11 day103 luffy项目结算部分+认证+django-redis
  9. [CTF]2022美团CTF WEB WP
  10. 【iOS开发】—— SDWebImage源码学习(未完)