php网页抓取乱码(php数据库读出乱码是说明原因,中文就倒霉了)
优采云 发布时间: 2021-12-13 04:09php网页抓取乱码(php数据库读出乱码是说明原因,中文就倒霉了)
从php数据库读取的乱码是原因
一般来说,出现乱码的原因有两个。一是编码(charset)设置错误,导致浏览器解析错误编码,导致满屏乱七八糟的《天书》,二是文件解析错误。编码被打开,然后被保存。例如,一个原本用GB2312编码的文本文件被打开并以UTF-8编码保存。解决上述乱码问题,首先需要知道开发中哪些环节涉及到编码:
1、文件编码:指页面文件(.html、.php等)本身保存的编码。Notepad和Dreamweaver在打开页面时会自动识别文件编码,所以不太可能出现问题。但是,ZendStudio 不会自动识别编码。它只会根据首选项的配置打开具有特定编码的文件。如果不注意工作,打开编码错误的文件,修改后保存,会出现乱码。
2、 页面声明代码:在HTML代码HEAD中,可以使用"meta http-equiv="Content-Type" content="text/html; charset="XXX" /" (这句话一定要写在" Before TItle"XXX"/TItle",否则页面会是空白的(IE+PHP only)告诉浏览器网页使用的是什么编码。目前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中定义了两个默认代码,分别是[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头发送给浏览器,它的优先级比页面中声明的代码要高,浏览器自然会误认。有两种解决方案,
php数据库读取乱码的解决方法
在后台读取数据时,通常会出现乱码,例如“汉字”变成“?”等,造成这种情况的原因通常是编码设置不正确。解决方法如下:
第一种方法:在php中添加如下代码,设置编码格式为“utf-8”,代码如下:
header("Content-Type: text/html; charset=UTF-8");
方法二:在php中再添加一行代码,也用于转码,代码如下:
$conn = mysqli_connect($servername, $username, $password, $mysqlname);
$conn-》query("SET NAMES utf8");
在这种情况下,首先创建链接,然后转码。
另外,在使用数据库时,可以直接手动创建表(不是代码)。通常,在表格中输入汉字时,无法显示或显示为“?” 浏览时。造成这种情况的原因也是编码问题。解决方法如下:
建表或建库时,表和库的编码格式必须统一,设置为:“utf8_general_ci”,如下图:
要解决乱码问题,首先要搞清楚你的数据库使用的是什么编码。如果未指定,它将是默认的 latin1。
我们最应该使用这3个字符集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;
查询 OK,0 行受影响,1 条警告(0.03 秒)
mysql》 desc mysqlcode;
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
| *敏*感*词* | tinyint (255) unsigned | 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值(空,'php恋人');
错误 1406(22001):第 1 行列“内容”的数据太长
字符集未指定为gbk,插入时出错
mysql》设置名称'gbk';
查询正常,0 行受影响(0.02 秒)
指定字符集为 gbk
mysql”插入mysqlcode值(空,'php恋人');
查询正常,1 行受影响(0.00 秒)
插入成功
mysql》 select * from mysqlcode;
| *敏*感*词* | 内容 |
| 1 | php 爱好 |
1 行(0.00 秒)
不指定字符集gbk也会出现乱码,如下
mysql》 select * from mysqlcode;
| *敏*感*词* | 内容 |
| 1 | php?? ? |
1 行(0.00 秒)
【在phpmyadmin中创建数据库并指定字符集】
根据需要选择表类型,这里是MyISAM(支持全文搜索);
整理并选择gbk_chinese_ci,即gbk字符集
gbk_bin 简体中文,二进制。gbk_chinese_ci 简体中文,不区分大小写。
在刚刚创建的数据库中插入数据库
为什么?因为数据库是gbk字符集,我们在操作的时候没有指定为gbk