php网页抓取乱码(PHP与数据库的编码应一致1.修改.8编码)

优采云 发布时间: 2021-12-21 05:18

  php网页抓取乱码(PHP与数据库的编码应一致1.修改.8编码)

  一。首先是PHP网页的编码

  1. php文件本身的编码和网页的编码要匹配

  一个。如果要使用gb2312编码,那么php应该输出header:header("Content-Type: text/html; charset=gb2312"),添加静态页面,所有文件的编码格式都是ANSI,可以用记事本并另存为 选择编码为 ANSI 并覆盖源文件。

  湾 如果要使用utf-8编码,php应该输出header:header("Content-Type: text/html; charset=utf-8"),添加静态页面,所有文件的编码格式为utf-8。保存为 utf-8 可能有点麻烦。一般在utf-8文件的开头都会有一个BOM。如果使用session,就会出现问题。你可以用editplus保存它。在editplus中,进入Tools->Preferences->File->UTF-8 Sign,选择始终删除,然后保存删除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]下添加:

  默认排序规则=utf8_bin

  init_connect='SET NAMES utf8'

  2. 添加mysql_query("set names'encoding'"); 在需要做数据库操作的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]:无法打开流:无效参数...

  警告:move_uploaded_file()[function.move-uploaded-file]:无法在...中移动''到''

  警告:filesize() [function.filesize]: stat failed for ... in ...

  警告:readfile() [function.readfile]:无法打开流:.. 中的参数无效。

  虽然在Linux环境下gb2312编码不会出现这些错误,但是保存的文件名出现乱码,无法读取文件。这时可以将参数转换为操作系统识别的编码。编码转换可以是mb_convert_encoding(string, New code, original code)或者iconv(original code, new code, 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等)本身保存的编码。Notepad和Dreamweaver在打开页面时会自动识别文件编码,所以不太可能出现问题。但是,ZendStudio 不会自动识别编码。它只会根据首选项的配置打开具有特定编码的文件。如果工作中不注意,打开编码错误的文件,修改后保存,会出现乱码(我深有体会)。

  2、 页面声明编码:在 HTML 代码 HEAD 中,可以用来告诉浏览器网页使用的是什么编码。目前,在中文网站的开发中,XXX主要使用两种编码,GB2312和UTF-8。

  3、数据库连接编码:指在进行数据库操作时,用于向数据库传输数据的编码。这里需要注意的是,不要与数据库本身的编码混淆。比如MySQL内部默认是latin1编码,也就是说Mysql的数据以latin1编码存储,其他编码传输到Mysql的数据会转换成latin1编码。

  知道了WEB开发中涉及到编码的地方,也就知道出现乱码的原因了:以上三种编码设置不一致。由于大多数各种编码都兼容ASCII,所以不会出现英文符号,中文会倒霉。.

  五。决战的一些常见错误情况及解决办法:

  1、数据库使用UTF8编码,页面声明编码为GB2312,这是乱码最常见的原因。这时候直接在PHP脚本中SELECT数据就乱码了。查询前需要使用:mysql_query("SET NAMES GBK"); 设置MYSQL连接码,保证页面声明码与这里设置的连接码一致(GBK是GB2312的扩展)。如果页面是UTF-8编码,可以使用:mysql_query("SET NAMES UTF8");

  注意是UTF8而不是一般的UTF-8。如果页面上声明的代码与数据库的内部代码一致,则可能没有设置连接代码。

  注:其实MYSQL的数据输入输出比上面说的还要复杂。MYSQL配置文件my.ini中定义了两个默认代码,分别是[client]中的默认-character-set和[mysqld]中的默认。-character-set 分别设置客户端连接和内部数据库使用的默认编码。我们上面指定的编码实际上是MYSQL客户端连接服务器时的命令行参数character_set_client,告诉MYSQL服务器接收到的客户端数据是什么编码,而不是使用默认的编码。

  2、 页面声明编码与文件本身的编码不一致。这种情况很少发生,因为如果编码不一致,在美工创建页面时浏览器会看到乱码。更多的时候是发布后修改了一些小BUG,打开代码错误的页面然后保存造成的。或者使用一些FTP软件直接在线修改文件,比如CuteFTP,因为软件编码配置错误导致转换错误编码。

  3、一些租虚拟主机的朋友,很明显上面3个编码设置正确或者出现乱码。比如网页是GB2312编码的,但是IE等浏览器打开时总是识别为UTF-8。网页的HEAD已经说明是GB2312了。手动修改浏览器编码为GB2312后,页面显示正常。原因是服务器Apache设置了服务器全局默认编码,在httpd.conf中添加了AddDefaultCharset UTF-8。这时候服务器会先把HTTP头发送给浏览器,它的优先级比页面中声明的代码要高,浏览器自然会误认。有两种解决方案,

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线