Come rimuovere% EF% BB% BF in una stringa PHP
-
27-09-2019 - |
Domanda
Sto cercando di utilizzare il 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));
I dati restituiti ha un '' carattere nel primo carattere della stringa restituita. Non si tratta di uno spazio, perché ho Trimed che prima di restituire i dati.
Il 'personaggio' si è rivelata% EF% BB% BF.
Mi chiedo perché questo è accaduto, forse un bug di Microsoft?
Come posso rimuovere questo% EF% BB% BF in PHP?
Altri suggerimenti
Si dovrebbe non solo scartare la distinta base meno che non siate sicuri al 100% che il flusso sarà:. (A) essere sempre UTF-8, e (b) hanno sempre una BOM UTF-8
I motivi:
- In UTF-8, una distinta è opzionale -. Quindi, se le si chiude servizio di inviarlo ad un certo punto futuro sarete buttare via i primi tre caratteri della vostra risposta, invece
- Lo scopo della distinta è quello di identificare univocamente il tipo di flusso UTF interpretato UTF-8? -16? o -32 ?, e anche per indicare il 'endian-ness' (ordine byte) delle informazioni codificate. Se basta buttare via si sta assumendo che si sta ottenendo sempre UTF-8; questo potrebbe non essere un buon presupposto.
- Non tutte le distinte base sono 3-byte lungo, solo la codifica UTF-8 uno è tre byte. UTF-16 è di due byte, e UTF-32 è di quattro byte. Quindi, se il servizio passa a una codifica UTF più ampia in futuro, il codice si romperà.
Penso che un modo più adeguato per gestire questo sarebbe qualcosa di simile:
/* 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);
}
E 'un byte order mark (BOM), che indica la risposta è codificato come UTF-8 . Si può tranquillamente rimuovere, ma si dovrebbe analizzare il resto come UTF-8.
Ho avuto lo stesso problema di oggi, e determinato garantendo la stringa è stato impostato su UTF-8:
http://php.net/manual/en/function.utf8- encode.php
$ content = utf8_encode ($ content);
Per rimuovere dall'inizio della stringa (solo):
$data = preg_replace('/^%EF%BB%BF/', '', $data);
$data = str_replace('%EF%BB%BF', '', $data);
Probabilmente non dovrebbe essere utilizzato stripslashes
-. A meno che i rendimenti API blackslashed dati (e il 99,99% di probabilità che non lo fa), prendere quella chiamata fuori