【发布时间】:2018-01-04 00:21:40
【问题描述】:
所以我尝试在 PHP 中使用 Bing 的拼写检查 API,但我遇到了一个问题,即重音符号和其他特殊字符没有被正确解码,从而产生了许多原始文本中没有的错误并弄乱了偏移量。
我的实现非常简单 - 它很大程度上基于他们在文档中提供的示例。我不确定我是否应该做一些不同的事情,或者他们如何解码这些特殊字符是否存在问题(这似乎极不可能 - 我搞砸的可能性更大......!)
代码如下:
$host = 'https://api.cognitive.microsoft.com';
$path = '/bing/v7.0/spellcheck?';
$data = array (
'mkt' => $lang,
'mode' => 'proof',
'text' => urlencode($text)
);
$encodedData = http_build_query($data);
$key = 'subscription key redacted for obvious reasons';
$headers = "Content-type: application/x-www-form-urlencoded\r\n" .
"Ocp-Apim-Subscription-Key: $key\r\n";
if (isset($_SERVER['REMOTE_ADDR']))
$headers .= "X-MSEdge-ClientIP: " . $_SERVER['REMOTE_ADDR'] . "\r\n";
$options = array (
'http' => array (
'header' => $headers,
'method' => 'POST',
'content' => $encodedData
)
);
$context = stream_context_create ($options);
$result = file_get_contents ($host . $path, false, $context);
if ($result === FALSE) {
# Handle error
}
$decodedResult = json_decode($result, true);
例如,如果我尝试对以下字符串进行拼写检查:
机构
$encodedData 变成如下:
mkt=fr-CA&method=proof&text=d%25E2%2580%2599institutions
我从 API 得到的结果如下:
array(2) {
["_type"]=>
string(10) "SpellCheck"
["flaggedTokens"]=>
array(1) {
[0]=>
array(4) {
["offset"]=>
int(8)
["token"]=>
string(14) "99institutions"
["type"]=>
string(12) "UnknownToken"
["suggestions"]=>
array(2) {
[0]=>
array(2) {
["suggestion"]=>
string(15) "99 institutions"
["score"]=>
float(0.93191315174102)
}
[1]=>
array(2) {
["suggestion"]=>
string(14) "99 institution"
["score"]=>
float(0.6518044080768)
}
}
}
}
}
如您所见,解码似乎有问题,因为 % 被编码了两次,并且显然只解码了一次。现在,如果我在 $data 中设置 'text' 的值时删除了 url_encode(),它可以很好地用于撇号,但它不适用于重音。例如下面的字符串:
责任
被 API 解释为
责任
返回错误。
这很可能是我忽略的一些简单的事情,但我已经为此苦苦挣扎了很长一段时间,如果我能得到任何帮助,我将不胜感激。
谢谢,
- 埃米尔
[ 编辑 ] 好吧,一如既往......当有疑问时,假设你错了。 API 建议更改常规字母的所有重音符号,因为即使指定的语言是法语,它仍然会以英语给出建议,而不是返回空数组。至于似乎没有被解码的口音,嗯......我正在 var_dump-ing 没有任何 doctype 集的数据,所以它当然会在没有正确编码的情况下显示。对此感到抱歉 - 最后,只需删除 urlencode() 就可以了!
【问题讨论】:
标签: php microsoft-cognitive bing-api