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?

Foi útil?

Solução

Você poderia usar substr Para conseguir o resto sem o UTF-8 BOM:

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

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:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top