使用curl获取数据乱码

在使用curl获取数据或者html源码时,经常发现获取到数据并不是utf-8的,输出时会是一堆乱码,经过一番寻找,终于找到一个合适的解决办法。


在php中,使用原生的curl进行数据抓取是很麻烦并且不优雅的,推荐大家使用guzzleHttp,其对curl进行了优雅的封装,功能非常强大。


发现问题

  1. 关于guzzle的使用请自行阅读文档,这里不再赘述;
  2. 在使用guzzle过程中发现很多数据并不是utf8编码,直接输出会是乱码,也使用了php内置的mb_convert_encoding( )、inconv( )等函数,发现效果并不理想,比如BIG5就识别不出;

解决问题

经过一番寻找,终于发现了phlib/guzzle-middleware,经试用之后发现其可以直接对抓取到的结果进行编码转换然后输出,非常方便;

  1. 使用composer直接将扩展安装

    1
    composer require phlib/guzzle-middleware
  1. 安装完成后,在实例化guzzle对象前,先进行如下操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    try {

    // 生成handler
    $handler = \GuzzleHttp\HandlerStack::create();
    $handler->push(new \Phlib\Guzzle\ConvertCharset());
    $handler->push(new \Phlib\Guzzle\AbsoluteUrls());

    // 设置请求参数
    $option = [
    'timeout' => 10,
    'handler' => $handler
    ];

    // 发起请求
    $client = new \GuzzleHttp\Client($option);
    $response = $client->get('需要请求的url');

    } catch (\Exception $exception) {
    return $exception->getMessage();
    }

    return (string)$response->getBody();
  2. 然后就会发现我们获取到的数据全部都是utf8编码,再也不会有乱码了。


本人测试量有限,如果你在使用过程中发现仍然有乱码或者你有更好的解决办法欢迎在文章末尾留言。