質問

マイクロソフトを使用しようとしています ビング 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%確信していない限り、単にBOMを破棄すべきではありません。

理由:

  1. UTF-8では、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);

$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

$ content = utf8_encode($ content);

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

$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