我正在尝试使用微软 必应 API。

$data = file_get_contents("http://api.microsofttranslator.com/V2/Ajax.svc/Speak?appId=APPID&text={$text}&language=ja&format=audio/wav");
$data = stripslashes(trim($data));

返回的数据在返回字符串的第一个字符中有一个“ ”字符。它不是空格,因为我在返回数据之前修剪了它。

' ' 字符结果是 %EF%BB%BF。

我想知道为什么会发生这种情况,也许是微软的错误?

如何在 PHP 中删除这个 %EF%BB%BF?

有帮助吗?

解决方案

您可以使用 substr 只得到休息没有的 UTF-8 BOM

// if it’s binary UTF-8
$data = substr($data, 3);
// if it’s percent-encoded UTF-8
$data = substr($data, 9);

其他提示

你不应该简单地抛弃的物料清单除非你是100%确保流将:(a)总是UTF-8,以及(b)始终有一个UTF-8的物料清单。

究其原因:

  1. 在UTF-8,BOM 可选的 -所以如果服务退出发在今后某个时间你会被扔掉的前三个字符的响应。
  2. 整个目的的物料清单是确定明确的类型UTF流被解释UTF-8?-16?或-32?, 并且还要指示'endian性(byte order)的编码信息。如果你只是把它扔掉你假设你总是得到UTF-8;这可能不是一个很好的假设。
  3. 不是所有的物料清单是3-字节长,只有UTF-8之一是三个字节。UTF-16就是两个字节,并UTF-32四个字节。因此,如果服务中切换到一个更广泛的UTF编码在未来的,你的代码会破裂。

我认为更适当的方式处理这会是这样的:

/* Detect the encoding, then convert from detected encoding to ASCII */
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "ASCII", $enc);

$data = file_get_contents("http://api.microsofttranslator.com/V2/Ajax.svc/Speak?appId=APPID&text={$text}&language=ja&format=audio/wav");
$data = stripslashes(trim($data));

if (substr($data, 0, 3) == "\xef\xbb\xbf") {
$data = substr($data, 3);
}

它是 字节顺序标记 (BOM),表示响应被编码为 UTF-8. 。您可以安全地删除它,但您应该将其余部分解析为 UTF-8。

我今天有同样的问题,并通过确保字符串固定设定为UTF-8:

http://php.net/manual/en/function.utf8- encode.php

$含量=函数utf8_encode($内容);

要从字符串的开头删除它(只):

$data = preg_replace('/^%EF%BB%BF/', '', $data);

$data = str_replace('%EF%BB%BF', '', $data);

您可能不应该使用被stripslashes - 除非API返回blackslashed数据(和99.99%的几率不会),采取叫出

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top