php网页抓取乱码(一般来说,乱码的出现有2种原因,你知道吗?)
优采云 发布时间: 2021-12-24 14:10php网页抓取乱码(一般来说,乱码的出现有2种原因,你知道吗?)
一般来说,出现乱码的原因有两个。一是由于编码(charset)设置错误,导致浏览器用错误的编码解析,导致《天书》满屏乱七八糟,二是文件错误编码为打开然后保存。例如,一个原本用GB2312编码的文本文件被打开并以UTF-8编码保存。解决上述乱码问题,首先需要知道开发中哪些环节涉及到编码:
1、文件编码:指页面文件(.html、.php等)本身保存的编码。Notepad和Dreamweaver在打开页面时会自动识别文件编码,所以不太可能出现问题。但是,ZendStudio 不会自动识别编码。它只会根据首选项的配置打开具有特定编码的文件。如果不注意工作,打开编码错误的文件,修改后保存,会出现乱码。
2、 页面声明编码:在HTML代码HEAD中,可以使用(这句话一定要写在XXX之前,否则页面会是空白的(仅限IE+PHP))告诉浏览器该网页使用什么编码在目前,GB2312和UTF-8主要用于中文网站的开发。
3、数据库连接编码:是指在进行数据库操作时,用于向数据库传输数据的编码。这里需要注意的是,不要与数据库本身的编码混淆。比如MySQL内部默认是latin1编码,即Mysql数据以latin1编码存储,其他编码传输到Mysql的数据会转换成latin1编码。
知道了WEB开发中涉及到编码的地方,也就知道出现乱码的原因了:以上三种编码设置不一致。由于大多数各种编码都兼容ASCII,所以不会出现英文符号,中文会倒霉。. 以下是一些常见的错误情况和解决方法:
1、数据库使用UTF8编码,页面声明编码为GB2312,这是乱码最常见的原因。这时候在PHP脚本中直接SELECT数据是乱码,需要在查询前使用:
mysql_query("SET NAMES GBK");
或mysql_query("SET NAMES GB2312");
设置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、一些租虚拟主机的朋友,很明显上面三种编码设置正确或者出现乱码。比如网页是GB2312编码的,但是IE等浏览器打开时总是识别为UTF-8。网页的 HEAD 已经声明它是 GB2312。手动修改浏览器编码为GB2312后,页面显示正常。原因是服务器Apache设置了服务器全局默认编码,在httpd.conf中添加了AddDefaultCharset UTF-8。这时候服务器会先把HTTP头发送给浏览器,它的优先级比页面中声明的代码要高,浏览器自然会误认。有两种解决方案,
乱码解决方案
要解决乱码问题,首先要搞清楚你的数据库使用的是什么编码。如果未指定,它将是默认的 latin1。
我们最应该使用这3个字符集gb2312、gbk、utf8。
那么我们如何指定数据库的字符集呢?下面也以gbk为例
【在MySQL命令行客户端创建数据库】
mysql> 创建表`mysqlcode` (
-> `id` TINYINT(255) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
->`内容`VARCHAR(255)非空
->) TYPE = MYISAM 字符集 gbk COLLATE gbk_chinese_ci;
查询 OK,0 行受影响,1 个警告(0.03 秒)
mysql> 描述 mysqlcode;
+---------+-----------------------+------+-----+-- -------+----------------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+---------+-----------------------+------+-----+-- -------+----------------+
| *敏*感*词* | tinyint(255) unsigned | NO | PRI | | auto_increment |
| 内容 | varchar(255) | NO | | | |
+---------+-----------------------+------+-----+-- -------+----------------+
2 行(0.02 秒)
后者 TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
就是指定数据库的字符集,COLLATE(排序规则),让mysql同时支持多种编码的数据库。
当然我们也可以通过下面的指令修改数据库的字符集
更改数据库 da_name 默认字符集'charset'。
客户端以gbk格式发送,可以使用如下配置:
SET character_set_client='gbk'
SET character_set_connection='gbk'
SET character_set_results='gbk'
此配置等效于 SET NAMES'gbk'。
现在对刚刚创建的数据库进行操作
mysql> 使用测试;
数据库已更改
mysql> insert into mysqlcode values(null,'phplovers');
错误 1406(22001):第 1 行列“内容”的数据太长
字符集未指定为gbk,插入时出错
mysql> 设置名称'gbk';
查询正常,0 行受影响(0.02 秒)
指定字符集为 gbk
mysql> insert into mysqlcode values(null,'phplovers');
查询正常,1 行受影响(0.00 秒)
插入成功
mysql> 从 mysqlcode 中选择 *;
+----+-----------+
| *敏*感*词* | 内容 |
+----+-----------+
| 1| php 爱好 |
+----+-----------+
1 行(0.00 秒)
不指定字符集gbk也会出现乱码,如下
mysql> 从 mysqlcode 中选择 *;
+----+---------+
| *敏*感*词* | 内容 |
+----+---------+
+----+---------+
1 行(0.00 秒)
【在phpmyadmin中创建数据库并指定字符集】
根据需要选择表类型,这里是MyISAM(支持全文搜索);
整理并选择gbk_chinese_ci,即gbk字符集
gbk_bin 简体中文,二进制。gbk_chinese_ci 简体中文,不区分大小写。
在刚刚创建的数据库中插入数据库
再次浏览时,发现是乱码
为什么?因为数据库是gbk字符集,我们在操作的时候没有指定为gbk