php网页抓取乱码(一般来说,乱码的出现有2种原因,你知道吗?)

优采云 发布时间: 2022-03-31 17:11

  php网页抓取乱码(一般来说,乱码的出现有2种原因,你知道吗?)

  一般来说,出现乱码的原因有两个。首先,错误的编码(charset)设置导致浏览器解析错误的编码,导致满屏的“天书”乱七八糟。编码打开,然后保存。例如,文本文件最初以 GB2312 编码,但以 UTF-8 编码打开和保存。要解决上面的乱码问题,首先要知道开发的哪些方面涉及到编码:

  1、文件编码:是指保存页面文件(.html、.php等)本身的编码。记事本和 Dreamweaver 在打开页面时会自动识别文件编码,因此问题较少。然而,ZendStudio 不会自动识别编码。它只会根据首选项的配置打开具有某种编码的文件。如果工作时不注意,打开编码错误的文件。修改后保存,会出现乱码。

  2、页面声明代码:在HTML代码HEAD中,可以使用(这句话一定要写在XXX前面,否则页面会空白(IE+PHP only))告诉浏览器网页是什么代码用途,目前中文网站主要用于GB2312和UTF-8两种编码的开发。

  3、数据库连接代码:是指在进行数据库操作时,使用哪个代码向数据库传输数据。这里需要注意的是不要和数据库本身的代码混淆。例如MySQL内部默认为latin1编码,即Mysql数据以latin1编码存储,其他编码传输到Mysql的数据会转成latin1编码。

  知道了WEB开发涉及到哪里编码,也就知道乱码的原因了:以上3种编码设置不一致,因为各种编码大部分都兼容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定义了两种默认编码,即[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头发送给浏览器,它的优先级高于页面中声明的代码,所以浏览器会认错。有两种解决方案。请在配置文件的虚拟机中添加一个AddDefaultCharset GB2312来覆盖全局配置,

  乱码解决方案

  要解决乱码问题,首先要弄清楚你的数据库使用的是什么编码。如果未指定,它将是默认的 latin1。

  我们应该最多使用gb2312、gbk、utf8这三个字符集。

  那么我们如何指定数据库的字符集呢?下面也是gbk的一个例子

  [在 MySQL 命令行客户端中创建数据库]

  mysql> 创建表`mysqlcode` (

  -> `id` TINYINT(255) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

  -> `content` VARCHAR( 255 ) NOT NULL

  -> ) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;

  查询正常,0 行受影响,1 个警告(0.03 秒)

  mysql> desc mysqlcode;

  +---------+----------+------+-----+-- -------+----------------+

  | 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |

  +---------+----------+------+-----+-- -------+----------------+

  | 编号 | tinyint(255) 无符号 | NO | PRI | | auto_increment |

  | 内容 | varchar(255) | 否 | | | |

  +---------+----------+------+-----+-- -------+----------------+

  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> 插入 mysqlcode 值(null,'php 爱好者');

  错误 1406(22001):第 1 行的列“内容”的数据太长

  字符集未指定为 gbk,插入时出错

  mysql> 设置名称 'gbk';

  查询正常,0 行受影响(0.02 秒)

  指定字符集为 gbk

  mysql> 插入 mysqlcode 值(null,'php 爱好者');

  查询正常,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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线