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

bbn*_*bnn 3 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));
Run Code Online (Sandbox Code Playgroud)

返回的数据在返回的字符串的第一个字符中有一个'\n'字符.它不是空间,因为我在返回数据之前对其进行了尝试.

''角色竟然是%EF%BB%BF.

我想知道为什么会这样,也许是微软的错误?

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

Lee*_*Lee 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编码,您的代码将会中断.

我认为处理这个问题的更合适的方法是:

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

  • 这似乎在实践中不起作用.`mb_convert_encoding("\ 357\273\277some text",'ASCII',mb_detect_encoding("\ 357\273\277some text"))````string(10)"?some text"`.请注意,它在输出中留下了问号. (2认同)
  • @mark我必须添加以下行才能摆脱?: ini_set('mbstring.substitute_character', "无"); (2认同)

D3F*_*ULT 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);
}


Gum*_*mbo -3

您可以使用substr只获取没有UTF-8 BOM 的其余部分:

\n\n
// if it\xe2\x80\x99s binary UTF-8\n$data = substr($data, 3);\n// if it\xe2\x80\x99s percent-encoded UTF-8\n$data = substr($data, 9);\n
Run Code Online (Sandbox Code Playgroud)\n

  • 致未来的谷歌用户:[改用此解决方案](http://stackoverflow.com/a/4057875/457104)。丢弃 BOM 是一个**坏主意**。 (2认同)