¿Cómo eliminar% EF% BB% BF en una cadena PHP
-
27-09-2019 - |
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?
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:
- 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
- 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.
- 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