Question

Je tente d'utiliser l'API 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));

Les données renvoyées a un « » caractère dans le premier caractère de la chaîne retournée. Il est pas un espace, parce que je trimed avant de retourner les données.

Le 'caractère' est avéré être% EF% BB% BF.

Je me demande pourquoi cela est arrivé, peut-être un bug de Microsoft?

Comment puis-je supprimer ce% EF% BB% BF en PHP?

Était-ce utile?

La solution

Vous pouvez utiliser substr pour obtenir que le reste sans UTF-8 BOM :

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

Autres conseils

Vous ne devez pas jeter simplement la nomenclature sauf si vous êtes sûr à 100% que le flux:. (A) toujours UTF-8, et (b) toujours une nomenclature UTF-8

Les raisons:

  1. En UTF-8, une nomenclature est option -. Donc, si les départs volontaires de service de l'envoyer à un moment de l'avenir, vous serez jettes les trois premiers caractères de votre réponse à la place
  2. Le but de la nomenclature est d'identifier sans ambiguïté le type de flux UTF étant UTF-8 interprété? -16? ou -32 ?, et également pour indiquer la « endian-ness » (de l'ordre des octets) de l'information codée. Si vous jetez juste là, vous êtes en supposant que vous êtes toujours obtenir UTF-8; ce ne peut être une très bonne prise en charge.
  3. Pas tous les trois sont BOM-octets, que l'UTF-8 est un trois octets. UTF-16 est de deux octets, et UTF-32 est de quatre octets. Donc, si les commutateurs service à un codage UTF plus large dans l'avenir, votre code cassera.

Je pense qu'une façon de gérer serait plus approprié ce quelque chose comme:

/* 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);
}

Il est un octet indicateur d'ordre (BOM), ce qui indique la réponse est codée sous la forme UTF-8 . Vous pouvez supprimer en toute sécurité, mais vous devez analyser le reste en UTF-8.

J'ai eu le même problème aujourd'hui, et fixé en assurant la chaîne a été mis en UTF-8:

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

$ content = utf8_encode ($ contenu);

Pour supprimer dès le début de la chaîne (uniquement):

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

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

Vous devriez probablement pas en utilisant stripslashes -. À moins que les déclarations de l'API des données blackslashed (et 99,99% de chances qu'il ne fonctionne pas), prendre cet appel à

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top