如何在PHP字符串中删除%EF%BB%BF

我正在尝试使用Microsoft Bing 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));
返回的数据在返回的字符串的第一个字符中有一个' n'字符。它不是空间,因为我在返回数据之前对其进行了尝试。 ''角色竟然是%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 BOM,否则不应简单地丢弃BOM。 原因: 在UTF-8中,BOM是可选的 - 因此,如果服务在将来某个时候退出发送它,您将丢弃响应的前三个字符。 BOM的整个目的是明确地识别UTF-8被解释的UTF流的类型? -16?或-32 ?,并且还指示编码信息的'endian-ness'(字节顺序)。如果你扔掉它就会假设你总是得到UTF-8;这可能不是一个很好的假设。 并非所有BOM都是3字节长,只有UTF-8是3字节。 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) == "xefxbbxbf") {
$data = substr($data, 3);
}
    
它是字节顺序标记(BOM),表示响应编码为UTF-8。您可以安全地删除它,但您应该将剩余部分解析为UTF-8。     
我今天遇到了同样的问题,并通过确保字符串设置为UTF-8来修复: http://php.net/manual/en/function.utf8-encode.php $ content = utf8_encode($ content);     
要从字符串的开头删除它(仅):
$data = preg_replace('/^%EF%BB%BF/', '', $data);
    
$data = str_replace('%EF%BB%BF', '', $data);
您可能不应该使用
stripslashes
- 除非API返回黑色数据(并且99.99%的可能性没有),请接听该呼叫。     

要回复问题请先登录注册