问题描述
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方法有没有通过设置哪个参数可以解决这个问题?
没遇到过,看来你只能请求2次了,哈