Frage

Ich versuche, das Microsoft Bing API zu verwenden.

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

Die Daten zurückgegeben haben einen ‚‘ Charakter in dem ersten Zeichen der zurückgegebenen Zeichenfolge. Es ist kein Platz, weil ich es trimed, bevor die Daten zurück.

Die '' gedreht Zeichen% EF erwiesen% BB% BF.

Ich frage mich, warum dies passiert ist, vielleicht einen Fehler von Microsoft?

Wie kann ich entfernen Sie dieses% EF% BB% BF in PHP?

War es hilfreich?

Lösung

könnten Sie verwenden substr nur den Rest zu erhalten, ohne die UTF-8 BOM :

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

Andere Tipps

Sie sollten nicht einfach die Stückliste verwerfen, es sei denn Sie sind 100% sicher, dass der Strom wird. (A) immer UTF-8, und (b) immer ein UTF-8 BOM hat

Die Gründe:

  1. In UTF-8, eine Stückliste ist optional -. Also, wenn die Dienstleistung quitt es zu einem späteren Zeitpunkt zu senden werden Sie stattdessen die ersten drei Zeichen Ihrer Antwort werden Wegwerfen
  2. Der ganze Zweck der Stückliste ist eindeutig die Art von UTF-Stream zu identifizieren interpretiert wird UTF-8? -16? oder -32 ?, und auch, um anzuzeigen, die ‚Bytereihenfolge‘ (Byte-Reihenfolge) der codierten Information. Wenn Sie werfen es einfach weg Sie gehen davon aus, dass Sie immer UTF-8 bekommen; Dies kann nicht eine sehr gute Annahme.
  3. Nicht alle Stücklisten sind 3-Bytes lang, nur die UTF-8 ist drei Bytes. UTF-16 sind zwei Bytes und UTF-32 ist vier Bytes. Also, wenn die Service-Schalter auf eine breitere UTF-Codierung in der Zukunft, Ihr Code brechen.

ich denke, eine angemessenere Art und Weise dies etwas zu handhaben wäre wie:

/* 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);
}

Es ist ein Bytereihenfolgemarkierung (BOM), die Antwort, die anzeigt ist codiert als UTF-8 . Sie können es sicher entfernen, aber Sie sollten den Rest als UTF-8 analysieren.

Ich hatte das gleiche Problem heute und fixiert, indem die Zeichenfolge sichergestellt wurde auf UTF-8:

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

$ content = utf8_encode ($ content);

Um es von Anfang an der Schnur zu entfernen (nur):

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

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

Sie sollten wahrscheinlich nicht stripslashes verwenden -. Es sei denn, die API-Daten zurückgibt blackslashed (und 99,99% Chance, es nicht), nehmen Sie den Anruf aus

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top