php curl响应报文不完整

问题描述

    head头的编码与body报文编码不一致,curl请求导致接收到的报文不完整

问题出现的环境背景

    比如某次对接过程中,对方返回的head头是gbk编码(Content-type: text/xml; charset=GBK),但是body里面的报文是UTF-8编码,导致返回的报文不完整

相关代码

function curl($url,$data = '',$header=null)
{
    //初始化curl
    $curl = curl_init();
    //设置cURL传输选项
    if(is_array($header))
    {
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

    if (!empty($data)){//post方式
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    //获取采集结果
    $output = curl_exec($curl);
    $error = curl_errno($curl);
    //关闭cURL链接
    curl_close($curl);
    if($error){
        return $error;
    }else{
        return $output;
    }
}

详细描述

    具体原因是因为GBK编码,一个中文字符是占用两个字节,而UTF-8编码一个中文字符是占用三个字节,curl请求响应回来的字符长度是按照GBK编码计算的,导致计算出来的报文字符长度是小于实际长度的,所以读取响应数据的时候,读到计算出来的长度时候就停止了,也就会出现返回的报文不完整情况

解决方案:

    不采用curl方法进行请求,改用file_get_contents方法,因为file_get_contents不会返回head信息,所以不会出现编码不一致的情况
    
    现在想问一下各位大神,curl方法有没有通过设置哪个参数可以解决这个问题?

阅读 3k
1 个回答

没遇到过,看来你只能请求2次了,哈

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题