Wie entfernen% EF% BB% BF in einem PHP-String
-
27-09-2019 - |
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?
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:
- 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
- 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.
- 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