php网页抓取乱码(PHP中文乱码有时发生在网页本身产生在于MySQL交互)
优采云 发布时间: 2022-02-27 17:04php网页抓取乱码(PHP中文乱码有时发生在网页本身产生在于MySQL交互)
PHP中文乱码有时出现在网页本身,有的出现在与MySQL交互的过程中,有时与操作系统有关。下面给出一个摘要。
一。首先是PHP网页的编码
最好最快的解决方案是页面声明的代码与数据库的内部代码保持一致。如果页面应用的页码与数据库内部代码不一致,设置连接代码。
代码显示如下
mysql_query("设置名称 XXX");
XXX 是连接代码。它必须能够解决乱码问题。
1. php文件本身的编码和网页的编码要匹配a。如果你想使用 gb2312 编码,那么 php 应该输出 header:
代码显示如下
header("内容类型: text/html; charset=gb2312"),
添加静态页面
代码显示如下
,
所有文件的编码格式都是ANSI,可以用记事本打开,另存为ANSI,覆盖源文件。湾。如果你想使用 utf-8 编码,那么 php 应该输出 header:
代码显示如下
header("内容类型: text/html; charset=utf-8"),
添加静态页面
代码显示如下
,
所有文件都以 utf-8 编码。保存为 utf-8 可能有点麻烦。一般情况下,一个 utf-8 文件的开头都会有一个 BOM。如果使用会话,就会出现问题。您可以使用editplus来保存它。在editplus中,tools->parameter selection->file->UTF-8 Signature,选择Always delete,然后save去掉BOM信息。
2. php本身不是Unicode,substr等所有函数都必须改成mb_substr(需要安装mbstring扩展);或使用 iconv 进行转码。
二。PHP与Mysql的数据交互
PHP和数据库的编码要一致
1.修改mysql配置文件my.ini或者f,mysql最好用utf8编码
代码显示如下
[mysql] 默认字符集=utf8 [mysqld] 默认字符集=utf8 默认存储引擎=MyISAM
在 [mysqld] 下添加:
代码显示如下
default-collation=utf8_bin init_connect='SET NAMES utf8'
2. 添加mysql_query("设置名称'编码'"); 之前需要做数据库操作的php程序,编码和php编码一样,如果php编码是gb2312,那么mysql编码就是gb2312,如果是utf-8,那么mysql编码就是utf8,所以插入或检索数据时不会出现乱码
三。PHP 和操作系统相关的 Windows 和 Linux 的编码是不同的。在windows环境下,如果调用php函数时参数为utf-8编码,会出现错误,如move_uploaded_file()、filesize()、readfile()等,这些函数在处理上传下载时经常用到,而调用时可能会出现以下错误: 警告:move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in ... 警告: move_uploaded_file()[function.move-uploaded-file]:Unable将 '' 移动到 '' in ... 警告:filesize() [function.filesize]: stat failed for ... in ... 警告:readfile() [function.readfile]:打开流失败:参数无效在..虽然在Linux环境下用gb2312编码不会出现这些错误,保存后文件名乱码,无法读取文件。参数被转换成操作系统识别的编码。编码转换可以是mb_convert_encoding(string,new encoding, original encoding)或者iconv(original encoding,new encoding,string),这样处理后保存的文件名不会出现乱码,也可以正常读取文件,并且可以实现中文名称文件的上传和下载。其实还有更好的方案,完全脱离系统,不需要考虑系统编码什么。您可以生成一个只有字母和数字的序列作为文件名,并将原来的中文名称保存在数据库中,这样调用move_uploaded_file()就不会出现问题。下载时,
实现下载的代码如下
代码显示如下
header("Pragma: public");
header("过期时间:0");
header("Cache-Component: must-revalidate, post-check=0, pre-check=0");
header("内容类型:$file_type");
header("内容长度:$file_size");
header("内容配置:附件;文件名="$file_name"");
header("内容传输编码:二进制"); 读取文件($file_path);
$file_type 是文件的类型,$file_name 是原创名称,$file_path 是存储在服务上的文件的地址。
四。下面总结一下为什么乱码一般都是乱码。出现乱码的原因有两个。首先是错误的编码(charset)设置,导致浏览器解析错误的编码,导致满屏都是“天上掉下来的书”,其次是用错误的编码打开文件然后保存。例如,最初以 GB2312 编码的文本文件以 UTF-8 编码打开并保存。要解决上面的乱码问题,首先要知道开发的哪些方面涉及到编码:
1、文件编码:是指保存页面文件(.html、.php等)本身的编码。记事本和 Dreamweaver 在打开页面时会自动识别文件编码,因此问题较少。然而,ZendStudio 不会自动识别编码。它只会根据首选项的配置打开具有某种编码的文件。如果工作时不注意,打开编码错误的文件,修改后保存,就会出现乱码(感觉很深)。
2、页面声明代码:在HTML代码HEAD中,可以使用
代码显示如下
为了告诉浏览器网页使用什么编码,目前中文网站XXX主要使用GB2312和UTF-8两种编码。3、数据库连接代码:指在数据库操作过程中,使用哪个代码向数据库传输数据。这里需要注意的是不要和数据库本身的代码混淆。例如MySQL内部默认为latin1编码,即Mysql数据以latin1编码存储,其他编码传输到Mysql的数据会转成latin1编码。知道了WEB开发涉及到哪里编码,也就知道乱码的原因了:以上3种编码设置不一致,因为各种编码大部分都兼容ASCII,所以不会出现英文符号,中文会倒霉。.
五号。Showdown一些常见的错误情况和解决方法:
1、数据库使用UTF8编码,页面声明编码为GB2312,这是最常见的乱码原因。此时PHP脚本中直接SELECT数据出现乱码,查询前需要用到:
代码显示如下
mysql_query("设置名称 GBK");
设置MYSQL连接码,保证页面声明码和这里设置的连接码一致(GBK是GB2312的扩展)。如果页面是 UTF-8 编码的,您可以使用:
代码显示如下
mysql_query("设置名称 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来覆盖全局配置,或者在自己目录的.htaccess中进行配置。总结:一句话,解决PHP中文乱码最多的最快的办法就是让页面上声明的代码与数据库内部代码保持一致。
代码显示如下
mysql_query("设置名称 XXX");
XXX 是连接代码。它必须能够解决乱码问题。