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

时间:2010-10-30 07:37:06

标签: php bing-api microsoft-translator

我正在尝试使用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?

7 个答案:

答案 0 :(得分:17)

除非您100%确定流将:(a)始终为UTF-8,并且(b)始终具有UTF-8 BOM,否则不应简单地丢弃BOM。

原因:

  1. 在UTF-8中,BOM是可选 - 因此,如果服务在将来某个时候退出发送,您将丢弃响应的前三个字符。
  2. BOM的整个目的是明确地识别UTF-8被解释的UTF流的类型? -16?或-32 ?,并且还指示编码信息的'endian-ness'(字节顺序)。如果你扔掉它就会假设你总是得到UTF-8;这可能不是一个很好的假设。
  3. 并非所有BOM都是3字节长,只有UTF-8是3字节。 UTF-16是两个字节,UTF-32是四个字节。因此,如果服务将来切换到更宽的UTF编码,您的代码就会中断。
  4. 我认为更合适的方法是:

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

答案 1 :(得分:5)

$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);
}

答案 2 :(得分:2)

这是byte order mark(BOM),表示响应编码为UTF-8。您可以安全地删除它,但您应该将剩余部分解析为UTF-8。

答案 3 :(得分:0)

我今天遇到了同样的问题,并通过确保字符串设置为UTF-8来修复:

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

$ content = utf8_encode($ content);

答案 4 :(得分:-1)

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

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

答案 5 :(得分:-1)

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

您可能不应该使用stripslashes - 除非API返回黑色数据(并且99.99%的可能性没有),请接听该电话。

答案 6 :(得分:-3)

您可以使用substr仅在没有UTF-8 BOM的情况下使用{{3}}:

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