视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何解决php中文字符乱码问题
2020-11-02 18:46:11 责编:小采
文档


PHP中文乱码原因及解决办法分析

PHP网页的编码

1.如果欲使用gb2312编码,那么php要输出头:header("Content-type:text/html;charset=gb2312");,静态页面添加,所有文件的编码格式为ANSI,可用记事本打开,另存为选择编码为 ANSI,覆盖源文件。

2.如果欲使用utf-8编码,那么php要输出头:header("Content-type:text/html;charset=utf-8");,静态页面添加,所有文件的编码格式为utf-8。保存为utf-8可能会有点麻烦,一般utf-8文件开头会有BOM,如果使用session就会出问题,可用editplus来保存,在editplus中,工具->参数选择->文件->UTF-8签名,选择总是删除,再保存就可以去掉BOM信息了。

3.php本身不是 Unicode 的,所有substr之类的函数得改成mb_substr(需要装 mbstring 扩展);或者用 iconv 转码。

PHP与Mysql的数据交互

PHP与数据库的编码应一致

1.修改mysql配置文件my.ini或my.cnf,mysql 最好用 utf-8 编码

[mysql] 
default-character-set=utf8 
[mysqld] 
default-character-set=utf8 
default-storage-engine=MyISAM 
在[mysqld]下加入: 
default-collation=utf8_bin 
init_connect='SET NAMES utf8'

2.在需要做数据库操作的php程序前加mysql_query("set names '编码'");,编码和php编码一致,如果 php编码是 gb2312 那 mysql 编码就是 gb2312,如果是utf-8那 mysql 编码就是 utf8,这样插入或检索数据时就不会出现PHP中文乱码了。

关于编码

1、字符集:

在计算机底层中数据存储的都是二进制数据,要想获取真正有意义的字符,就必须让二进制数据与每一个字符对应起来,这种对应关系就形成了一张编码表。

常用字符集:

ISO-8859-1 拉丁码表 latin,表示西欧语言,使用一个字节即8位表示数据。

GB2312 简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节都是开头为1,都为负数。

GBK 目前最常用的中文码表,2万的中文和符号。用两个字节表示数据。

Unicode 国际标准码,无论是什么文字,都用两个字节存储。

UTF-8 基于Unicode,一个字节就可以存储数据,不用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息。

(Linux 默认使用的 ISO-8859-1,win32默认使用的GB2312)

2、编码和解码

编码: 将字符转换成在字符集中对应的编码

解码: 在字符集中查找出编码对应的字符

中文在网络中的传输过程

1、以Java为例,eclipse默认使用 UTF-8 编码集,Tomcat 服务器默认使用 ISO-8859-1编码集,浏览器一般默认使用 GBK 编码集。

程序与服务器之间以字符传输,服务器与浏览器之间以字节传输。

2、中文传输过程:

浏览器中的中文字符----->进行编码----->服务器----->进行解码----->程序;

程序中的中文字符----->服务器----->进行解码----->浏览器----->编码进行显示

3、乱码产生原因以解决方式:

(1)、浏览器中的中文字符以 GBK 进行编码,以字节流传输到服务器,服务器再以 ISO-8859-1进行解码,以字符的形式传输给程序。

因为 ISO-8859-1 编码集不支持中文字符,所有解码后的字符都是西欧字符,把这些字符传输给程序就产生了乱码;

针对这个原因,只要把服务器的编码集设置为 UTF-8 即可:

request.setCharacterEncoding("UTF-8");

但这种方法只能用于POST请求方式,因为设置只会作用于请求体中的内容,如果是GET请求方式,可用先解码再编码的方式:

byte[] buffer = request.getParameter("word").getBytes("ISO-8859-1"); //进行编码
String newStr = new String(buffer,"UTF-8"); //进行解码

(2)、程序中的中文字符原样传输到服务器,服务器要先对中文字符进行编码再传输给浏览器,但因为 ISO-8859-1 编码集不支持中文字符,所以在字符集中查找不到对应的编码,编码后就变成了问号,传输给了浏览器并显示;

针对这种情况,要进行两次设置:

response.setCharacterEncoding("UTF-8");//将服务器编码集设置为UTF-8
response.setContentType("text/html;charset=UTF-8"); //将浏览器编码集设置为UTF-8

实际上第二行设置已经包含了对服务器的设置,所以通常只要写第二句代码即可。

更多相关知识,请访问PHP中文网!

下载本文
显示全文
专题