admin管理员组文章数量:1559719
先不多说,上代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>TEST</title>
</head>
<body>
<?php
// getReqSign :根据 接口请求参数 和 应用密钥 计算 请求签名
// 参数说明
// - $params:接口请求参数(特别注意:不同的接口,参数对一般不一样,请以具体接口要求为准)
// - $appkey:应用密钥
// 返回数据
// - 签名结果
function getReqSign($params /* 关联数组 */, $appkey /* 字符串*/)
{
// 1. 字典升序排序
ksort($params);
// 2. 拼按URL键值对
$str = '';
foreach ($params as $key => $value)
{
if ($value !== '')
{
$str .= $key . '=' . urlencode($value) . '&';
}
}
// 3. 拼接app_key
$str .= 'app_key=' . $appkey;
// 4. MD5运算+转换大写,得到请求签名
$sign = strtoupper(md5($str));
return $sign;
}
// doHttpPost :执行POST请求,并取回响应结果
// 参数说明
// - $url :接口请求地址
// - $params:完整接口请求参数(特别注意:不同的接口,参数对一般不一样,请以具体接口要求为准)
// 返回数据
// - 返回false表示失败,否则表示API成功返回的HTTP BODY部分
function doHttpPost($url, $params)
{
$curl = curl_init();
$response = false;
do
{
// 1. 设置HTTP URL (API地址)
curl_setopt($curl, CURLOPT_URL, $url);
// 2. 设置HTTP HEADER (表单POST)
$head = array(
'Content-Type: application/x-www-form-urlencoded'
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
// 3. 设置HTTP BODY (URL键值对)
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
// 4. 调用API,获取响应结果
curl_setopt($curl, CURLOPT_HEADER, 2);
curl_setopt($curl, CURLOPT_NOBODY, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);// 对认证证书来源的检查
$response = curl_exec($curl);
if ($response === false)
{
$response = false;
break;
}
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($code != 200)
{
$response = false;
break;
}
} while (0);
curl_close($curl);
$response = mb_convert_encoding($response, 'UTF-8', 'GBK');
return $response;
}
// 设置请求数据(应用密钥、接口请求参数)
$appkey = 'xxxxxxxxxxxxx';
$params = array(
'app_id' => 'xxxxxxxxxxx',
'text' => '腾讯人工智能',
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
echo $params['sign'];
echo "<br/>";
// 执行API调用
$url = 'https://api.ai.qq/fcgi-bin/nlp/nlp_wordseg';
$response = doHttpPost($url, $params);
echo $response;
?>
</body>
</html>
得到的结果一堆乱码:
分析:这是参考腾讯文档写的demo,看代码,curl的各种处理都已经考虑到了,为什么还是乱码呢?mb_convert_encoding也已经到位,怎么调也不行,无非是变成乱码或问号的差别。可见并不是获取的数据有问题,问题出在传输给服务器的数据编码不对。从传输回来的header可见,编码是gbk。猜想服务器端可能并没有针对各种编码的数据进行检测和处理。因此,我们传给服务器的只能是GBK编码。
最后,直接把“<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />”改成“<meta http-equiv="Content-Type" content="text/html; charset=gbk" />”,搞定。
总结:在我使用腾讯API过程中,发现有很多这样的低级坑,只能程序猿自己去考虑了。千万不要以为大厂,什么都应该给你考虑到。不过也可以理解,毕竟它本质上不是一家技术型企业。
版权声明:本文标题:关于腾讯AI接口调用乱码的问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727423800a1113862.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论