使用Curl请求Google SERP时编码异常(特殊字符变问号)如何解决?
解决Curl请求Google波兰站SERP的编码异常问题
首先看你这段代码里的几个关键问题,直接导致了ś这类特殊字符显示成问号:
问题分析
- 用户代理设置错误:你用了
CURLOPT_HEADER来设置浏览器标识,这完全不对!CURLOPT_HEADER是控制是否返回响应头的开关,设置User-Agent应该用CURLOPT_USERAGENT。 - 未处理压缩响应:Google默认会返回gzip压缩的内容,不开启Curl的编码支持的话,拿到的是压缩后的乱码,转码自然会出错。
- 缺少输出编码声明:即使拿到了正确内容,输出时如果不告诉浏览器用UTF-8解析,特殊字符也会显示异常。
修改后的完整代码
$url = "https://www.google.pl/search?q=agawa+korzenie&oq=agawa+korzenie"; $ch = curl_init(); // 正确设置用户代理,模拟浏览器请求 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"); curl_setopt($ch, CURLOPT_URL, $url); // 开启自动处理gzip/deflate压缩,避免拿到乱码 curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate"); // 要求返回响应内容而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 设置请求头,明确告知服务器优先接受UTF-8编码内容 curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset: UTF-8,*' )); $icerik = curl_exec($ch); curl_close($ch); // 输出前强制声明页面编码为UTF-8,让浏览器正确解析 header('Content-Type: text/html; charset=UTF-8'); echo $icerik;
关键修改点说明
- 替换
CURLOPT_HEADER为CURLOPT_USERAGENT:正确模拟浏览器请求,避免Google返回非标准编码的内容。 - 开启
CURLOPT_ENCODING:让Curl自动解压Google返回的压缩内容,拿到原始的UTF-8文本。 - 添加
Accept-Charset请求头:明确告诉服务器我们优先接受UTF-8编码的响应,减少编码不匹配的概率。 - 输出前设置
header:强制浏览器用UTF-8解析页面,避免本地编码冲突导致特殊字符变成问号。
如果还是有异常,可以检查一下你的PHP文件本身是不是UTF-8编码(无BOM格式),有时候文件编码不对也会引发输出问题。
内容的提问来源于stack exchange,提问作者Sargit
相关产品推荐
相关产品推荐

