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?

È stato utile?

Soluzione

Si potrebbe usare substr per ottenere solo il resto, senza la UTF-8 BOM :

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

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:

  1. 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
  2. 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.
  3. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top