Pregunta

Estoy intentando utilizar el API de Microsoft Bing .

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

Los datos devueltos tiene un 'carácter' en el primer carácter de la cadena devuelta. No es un espacio, porque Trimed antes de devolver los datos.

El 'carácter' resultó ser% EF% BB% BF.

Me pregunto por qué sucedió esto, tal vez un error de Microsoft?

¿Cómo puedo eliminar este% EF% BB% BF en PHP?

¿Fue útil?

Solución

substr sólo para obtener el resto sin el UTF-8 BOM :

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

Otros consejos

Se debe no simplemente desechar la lista de materiales a menos que estés 100% seguro de que la corriente hará lo siguiente:. (A) siempre ser UTF-8, y (b) siempre tienen una lista de materiales UTF-8

Las razones:

  1. En UTF-8, una lista de materiales es opcional -. Por lo que si se cierra el servicio de enviarlo en algún momento futuro podrás ser tirar los tres primeros caracteres de su respuesta en vez
  2. Todo el propósito de la lista de materiales es identificar sin ambigüedad el tipo de flujo de UTF siendo interpretado UTF-8? -¿dieciséis? o -32 ?, y también para indicar el 'endian-dad' (orden de bytes) de la información codificada. Si usted acaba de tirar a la basura que está asumiendo que siempre está recibiendo UTF-8; esto puede no ser una muy buena suposición.
  3. No todas las listas de materiales son de 3 bytes de longitud, sólo el UTF-8 es uno de tres bytes. UTF-16 es de dos bytes, y UTF-32 es de cuatro bytes. Así que si el servicio cambia a una codificación UTF más amplia en el futuro, su código se romperá.

creo que una forma más adecuada de manejar esto sería algo como:

/* 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 un byte marca de orden de (BOM), lo que indica la respuesta se codifica como UTF-8 . Se puede quitar con seguridad, pero se debe analizar el resto como UTF-8.

Yo tenía el mismo problema hoy en día, y determinada garantizando la cadena se establece en UTF-8:

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

$ content = utf8_encode ($ contenido);

Para quitarlo del principio de la cadena (sólo):

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

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

Probablemente no debería estar utilizando stripslashes -. A menos que los rendimientos de la API blackslashed de datos (y el 99,99% de probabilidad de que no lo hace), llevan a cabo esa llamada

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top