从php cURL

时间:2017-04-16 16:46:10

标签: javascript php encoding character-encoding php-curl

(见帖子底部的更新)

使用Chrome网络记录器,我注意到给定的XHR请求:

请求标题

GET ... HTTP/1.1
Host: ...
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Origin: ...
Authorization: Jra45648WwbbQ
Accept: */*
Referer: ...
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8

响应标题

HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Authorization, Origin, Content-Type, Accept, Referer, User-Agent, deportes
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: ...
Access-Control-Expose-Headers: Authorization, x-request-id, x-mlbam-reply-after
Content-Type: application/octet-stream
Date: Sun, 16 Apr 2017 ... GMT
Server: nginx/1.11.3
Vary: Accept
X-Request-ID: ...
Content-Length: 16
Connection: keep-alive

回复内容为@ EqV¡^MSÁ9

完美。这是正确的输出。

现在,我需要使用cURL在PHP中重新创建这个确切的交换。所以我使用相同的标题复制请求。

    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_ENCODING => 'gzip',
        CURLOPT_RETURNTRANSFER => true
    ));

但是,这里的输出是@ EqV–¡^MSƒÁ’9,这显然是不同的。

我需要以原始格式(@ EqV¡^MSÁ9)获取它,因为最终PHP的输出将被提供给javascript脚本,charCodeAt的值在这两者之间有不同的结果输出。我不确定如何处理这个问题。

Example of the two different outputs in Notepad++

正如您所看到的,在XHR请求之后,Chrome中的响应预览是正确的:

Chrome Network Logger Preview

如果我将PHP页面输出的编码类型更改为 Western(ISO-8859-15),我会得到@ EqV¡^MSÁ9

如果我将该输出粘贴到Notepad ++中,我得到的东西非常,非常类似于我想要的东西,但仍然略有不同(在这种情况下,由一个单个字符不同)。那么也许这与我需要的编码非常接近?

Encoding

如何找到我需要的编码? chrome的默认编码是什么,因为它似乎处理响应就好了?

更新:我使用新值[{1}}进行了测试,并使用òÝD¶0v¢ÔL·ßÎO Ó为我提供了正确的结果。那么为什么编码特定的响应(mb_convert_encoding($r, 'utf-8', 'ISO-8859-15'))给我一个字符短的值?

2 个答案:

答案 0 :(得分:3)

Chrome默认编码为 UTF-8 ,如果您将其设置为UTF-8,则curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');您的文字将符合预期,您可以尝试{{3 }}。
检测编码也很痛苦,因为使用mb_detect_encoding会遇到很多问题,但在这种情况下,如果你指定预期的检测顺序会很有帮助:

mb_detect_encoding($val, 'UTF-8,ISO-8859-15');

根据我的个人经验,如果没有指定目标并且顺序正确,则无价值,例如,您需要在编码列表中UTF-8之前列出ISO-8859-1,否则它将返回ISO-8859-1大多数情况下

更新
hereCURLOPT_ENCODING => ''处理您可以尝试的所有编码,但正如我所说,因为您正在处理已知的编码UTF-8,请尝试

$ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_ENCODING => 'UTF-8',
        CURLOPT_RETURNTRANSFER => true
    ));

答案 1 :(得分:1)

您可以尝试检测八位字节流的编码,然后将其转换为已知的字符集。

$result = curl_exec($ch);
curl_close($ch);
echo mb_detect_encoding($result);
$resultUTF8 = mb_convert_encoding($result, 'ISO-8859-15', 'utf-8');