2010-10-30 3 views
2

J'essaie d'utiliser l'API Microsoft Bing. Les données retournées ont un caractère '' dans le premier caractère de la chaîne retournée. Ce n'est pas un espace, parce que je l'ai coupé avant de retourner les données.Comment supprimer% EF% BB% BF dans une chaîne PHP

Le caractère '' s'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?

Répondre

-3

Vous pouvez utiliser substr seulement obtenir 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); 
+0

merci beaucoup! Comment avez-vous appris cela? – bbnn

+0

Note: en général, jeter la nomenclature n'est pas une bonne idée. La nomenclature est là pour vous dire comment le reste de la chaîne doit être géré. Si vous l'ignorez simplement, en supposant qu'il s'agit d'une nomenclature à 3 octets UTF-8, vous vous posez de vrais problèmes si/quand l'encodage change. ... S'il vous plaît jeter un oeil à ma réponse ci-dessous pour plus de détails. – Lee

+2

Pour les futurs googleurs: [utilisez cette solution à la place] (http://stackoverflow.com/a/4057875/457104). Jeter la nomenclature est une ** mauvaise idée **. – crdx

-1

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

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

Il est un byte order mark (BOM) , indiquant que la réponse est codée UTF-8. Vous pouvez le supprimer en toute sécurité, mais vous devez analyser le reste comme UTF-8.

-1

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

Vous ne devriez probablement pas utiliser stripslashes - à moins que les déclarations API blackslashed données (et 99,99% de chances qu'il n'a pas), prendre cet appel à.

16

Vous ne devriez pas simplement jeter la nomenclature à moins d'être sûr à 100% que le flux: (a) sera toujours en UTF-8, et (b) aura toujours une nomenclature UTF-8.

Les raisons:

  1. en UTF-8, une nomenclature est en option - donc si le service quitte l'envoyer à un moment futur, 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 interprété UTF-8? -16? ou -32 ?, et aussi pour indiquer l '"endian-ness" (ordre des octets) de l'information codée. Si vous le jetez, vous assumez que vous obtenez toujours UTF-8; Ce n'est peut-être pas une très bonne hypothèse.
  3. Toutes les nomenclatures n'ont pas une longueur de 3 octets, seule l'octet UTF-8 a trois octets. UTF-16 est deux octets, et UTF-32 est quatre octets. Ainsi, si le service bascule vers un encodage UTF plus large dans le futur, votre code va se casser.

Je pense que d'une façon plus appropriée de gérer ce serait 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); 
+2

Cela ne semble pas fonctionner dans la pratique. 'mb_convert_encoding (" \ 357 \ 273 \ 277some text ", 'ASCII', mb_detect_encoding (" \ 357 \ 273 \ 277some text "))' cite 'string (10)"? du texte "'. Notez qu'il a laissé un point d'interrogation dans la sortie. – mpen

+0

@mark Malheureusement, cela semble être vrai. J'ai eu plus de chance en utilisant 'iconv ('UTF-8', 'ASCII // TRANSLIT // IGNORE', '\ 357 \ 273 \ 277some text') 'pour faire la converstion. Je suppose que 'mb_detect_encoding' serait utilisé pour détecter le jeu de caractères initial, qui serait alors passé comme premier argument à' iconv'. C'est plus un hack qu'il devrait être. – Lee

+1

@mark Je devais ajouter la ligne suivante pour se débarrasser de la? : ini_set ('mbstring.substitute_character', "aucun"); – naw103

4

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

+0

Cette solution est géniale! Cela m'a beaucoup aidé quand je n'ai pas trouvé la réponse. La meilleure partie logique est de faire une condition, si le Bex Hex Charakters existe, puis supprimez-les. Ce code semble enregistrer à l'avenir, même lorsque le serveur n'enverra pas de nomenclature, cette fonction fonctionnera toujours. +1 – Gkiokan

Questions connexes