3

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

返されたデータには、返された文字列の最初の文字に ' ' 文字が含まれています。データを返す前にトリミングしたため、スペースではありません。

' ' 文字は %EF%BB%BF であることが判明しました。

なぜこれが起こったのだろうか、おそらくマイクロソフトのバグでしょうか?

PHPでこの%EF%BB%BFを削除するにはどうすればよいですか?

4

7 に答える 7

17

ストリームが (a) 常に UTF-8 であり、(b) 常に UTF-8 BOM であることが 100% 確実でない限り、単純に BOM を破棄しないでください。

理由:

  1. UTF-8 では、BOM はオプションです。そのため、将来サービスが BOM の送信を停止した場合、代わりに応答の最初の 3 文字を破棄することになります。
  2. BOM の全体的な目的は、UTF-8 と解釈される UTF ストリームのタイプを明確に識別することです。-16? または -32?、また、エンコードされた情報の「エンディアンネス」(バイト順) を示します。それを捨てるだけでは、常に UTF-8 を取得していると想定していることになります。これはあまり良い仮定ではないかもしれません。
  3. すべての BOM が 3 バイトの長さではなく、UTF-8 のみが 3 バイトです。UTF-16 は 2 バイト、UTF-32 は 4 バイトです。そのため、将来、サービスがより広い UTF エンコーディングに切り替わると、コードが壊れます。

これを処理するより適切な方法は、次のようになると思います。

/* Detect the encoding, then convert from detected encoding to ASCII */
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "ASCII", $enc);
于 2010-10-30T08:21:00.703 に答える
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);
}

于 2013-08-13T20:54:49.537 に答える
2

これはバイト オーダー マーク(BOM) であり、応答がUTF-8としてエンコードされていることを示します。安全に削除できますが、残りは UTF-8 として解析する必要があります。

于 2010-10-30T07:42:07.390 に答える
-1

文字列の先頭から削除するには (のみ):

$data = preg_replace('/^%EF%BB%BF/', '', $data);
于 2010-10-30T07:40:43.030 に答える
-1

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

stripslashesAPI がブラックスラッシュされたデータを返さない限り (99.99% の確率で返さない場合)、その呼び出しを使用するべきではありません。

于 2010-10-30T07:42:53.623 に答える
-3

UTF-8 BOMsubstrなしで残りのみを取得するために使用できます。

// if it’s binary UTF-8
$data = substr($data, 3);
// if it’s percent-encoded UTF-8
$data = substr($data, 9);
于 2010-10-30T07:42:07.373 に答える