Como remover%ef%bb%bf em uma string php
-
27-09-2019 - |
Pergunta
Estou tentando usar a 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));
Os dados retornados têm um caractere '' no primeiro caractere da string retornada. Não é um espaço, porque eu o cortei antes de retornar os dados.
O caractere '' acabou sendo%ef%bb%bf.
Eu me pergunto por que isso aconteceu, talvez um bug da Microsoft?
Como posso remover esse%EF%BB%BF no PHP?
Outras dicas
Você não deve simplesmente descartar o nascimento, a menos que tenha 100% de certeza de que o fluxo: (a) sempre será UTF-8 e (b) sempre tenha um Bom UTF-8.
As razões:
- No UTF-8, um nascido é opcional - Portanto, se o serviço deixar de enviá -lo em algum ponto futuro, você estará jogando fora os três primeiros caracteres da sua resposta.
- Todo o objetivo da BOM é identificar inequivocamente o tipo de fluxo UTF que está sendo interpretado UTF-8? -16? ou -32?, e também para indicar o 'endian -ness' (ordem de byte) das informações codificadas. Se você apenas jogar fora, está assumindo que está sempre obtendo UTF-8; Isso pode não ser uma suposição muito boa.
- Nem todos os BOMs têm 3 bytes, apenas o UTF-8 é de três bytes. O UTF-16 são dois bytes e o UTF-32 é de quatro bytes. Portanto, se o serviço mudar para uma codificação mais ampla do UTF no futuro, seu código será interrompido.
Eu acho que uma maneira mais apropriada de lidar com isso seria 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);
}
É um Marca de pedidos de byte (Nascido), indicando que a resposta é codificada como UTF-8. Você pode removê-lo com segurança, mas deve analisar o restante como UTF-8.
Eu tive o mesmo problema hoje e corrigido garantindo que a string estivesse definida como UTF-8:
http://php.net/manual/en/function.utf8-encode.php
$ content = utf8_encode ($ content);
Para removê -lo do início da string (somente):
$data = preg_replace('/^%EF%BB%BF/', '', $data);
$data = str_replace('%EF%BB%BF', '', $data);
Você provavelmente não deveria estar usando stripslashes
- A menos que a API retorne dados BlackSlashed (e 99,99% de chance de que não o faça), atenda essa chamada.