Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 705|回复: 0

PHP中文乱码的三个原因及解决方法 [转]

[复制链接]
  • TA的每日心情
    奋斗
    7 天前
  • 签到天数: 803 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726482
    发表于 2021-5-8 13:03:09 | 显示全部楼层 |阅读模式

    我们在做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”)来实现。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-24 12:37 , Processed in 0.057807 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表