php curl 爬取网页内容出现中文乱码的解决方案

php之curl 2020-04-21 阅读 216 评论 0

问题描述

使用 PHP 的 curl 类库爬虫网页,需要根据网页源代码的编码进行分析,编码格式如 utf-8、gbk/gb2312 等。以下是使用 get 请求获取中关村的一个网页内容,因为其页面的编码是 gbk,出现了文字乱码,内容所下所示。

<html>
<head>
    <meta charset="gbk">
    <meta charset="GBK" />
    <title>����ΪP40 8GB/128GB/ȫ��ͨ/5G���������Ϊ P40 8GB/128GB/ȫ��ͨ/5G���ֻ�����_���_����_����-ZOL�йش�����</title>
    <meta name="keywords" content="P40 8GB/128GB/ȫ��ͨ/5G�����,��ΪP40 8GB/128GB/ȫ��ͨ/5G�����,��ΪP40 8GB/128GB/ȫ��ͨ/5G����,��ΪP40 8GB/128GB/ȫ��ͨ/5G������,��ΪP40 8GB/128GB/ȫ��ͨ/5G�湦��" />
    <meta name="description" content="ZOL�йش����߻�ΪP40 8GB/128GB/ȫ��ͨ/5G���ֻ������ṩ��ȫ�Ļ�ΪP40 8GB/128GB/ȫ��ͨ/5G���������ΪP40 8GB/128GB/ȫ��ͨ/5G���?�ΪP40 8GB/128GB/ȫ��ͨ/5G�����ܡ���ΪP40 8GB/128GB/ȫ��ͨ/5G�湦�ܽ���,Ϊ������ΪP40 8GB/128GB/ȫ��ͨ/5G���ֻ��ṩ�м�ֵ�IJο�" />

解决方法

参考 mb_convert_encoding 方法,转换字符的编码,需要安装 mbstring 支持,编译 PHP 的时候指定 --enable-mbstring可以将 gbk 和 utf-8 等编码格式相互转换,支持的字符编码

$url = "http://detail.zol.com.cn/1317/1316635/param.shtml";
$curl = curl_init();
// 省略 curl设置
...

$html = curl_exec($curl);
$utf8Body = mb_convert_encoding($html, 'utf-8','GBk');

将抓取的内容转码后,结果就正常了。

<html>
<head>
    <meta charset="gbk">
    <meta charset="GBK" />
    <title>【华为P40 8GB/128GB/全网通/5G版参数】华为 P40 8GB/128GB/全网通/5G版手机参数_规格_性能_功能-ZOL中关村在线</title>
    <meta name="keywords" content="P40 8GB/128GB/全网通/5G版参数,华为P40 8GB/128GB/全网通/5G版参数,华为P40 8GB/128GB/全网通/5G版规格,华为P40 8GB/128GB/全网通/5G版性能,华为P40 8GB/128GB/全网通/5G版功能" />
    <meta name="description" content="ZOL中关村在线华为P40 8GB/128GB/全网通/5G版手机参数提供最全的华为P40 8GB/128GB/全网通/5G版参数、华为P40 8GB/128GB/全网通/5G版规格、华为P40 8GB/128GB/全网通/5G版性能、华为P40 8GB/128GB/全网通/5G版功能介绍,为您购买华为P40 8GB/128GB/全网通/5G版手机提供有价值的参考" />
最后更新 2020-04-21