J'ai un service Web qui reçoit des données de divers clients. Certains d'entre eux envoient les données codées à l'aide de l'évasion (), tandis que les autres utilisent plutôt Encodomomponent (). Existe-t-il un moyen de détecter le codage utilisé pour échapper aux données? P>
5 Réponses :
Encouragez vos clients à utiliser Encodomomponent (). Voir cette page pour une explication: comparer l'évasion (), encodeuri () et encodericomponent () a>. Si vous voulez vraiment essayer de comprendre exactement comment quelque chose a été codé, vous pouvez essayer de rechercher certains des caractères qui s'échappent () et encodeuri () ne sont pas encodés. P>
Je conviens que, mais malheureusement, je ne peux pas forcer les clients à adopter une norme de codage.
En outre, peut-être quelque chose comme: la fonction iséboged (STR) {retour decoduricomponent (str)! == str;} code>
@RobertPitt Merci pour votre idée, cela a fonctionné pour moi. :)
Vous n'avez pas à les différencier. Escape () est appelé pour pourcentage de codage, il ne diffère que d'UriC codant dans la manière dont certains caractères encodent. Par exemple, l'espace est codé comme% 20 avec évasion mais + avec codage URI. Une fois décodé, vous avez toujours la même valeur. P>
Ils diffèrent sauvagement dans la manière dont les caractères non ASCII sont codés: Encodéuricomponent () produit pourcentage de séquences UTF-8 codées pendant l'évasion () pourcentage d'encode les octets (comme dans ISO-8859-1 octets).
Cela n'aidera pas le côté serveur, mais dans le côté client, j'ai utilisé des exceptions JavaScript pour détecter si l'encodage de l'URL a produit un codage ISO latin ou UTF8.
Decodomomponent code> jette une exception sur des séquences UTF8 non valides. P>
try {
result = decodeURIComponent(string);
}
catch (e) {
result = unescape(string);
}
Je me rends compte que c'est une vieille question, mais je ne suis pas au courant d'une meilleure solution. Donc, je le fais comme ceci (grâce à un commentaire de RobertPitt ci-dessus): Je n'ai pas encore rencontré un cas où cela a échoué. Ce qui ne signifie pas que l'affaire n'existe pas. Peut-être que quelqu'un pouvait éclairer une lumière sur cela. P> p>
Ça va échouer quand où est quelque chose que quelque chose en partiellement codé, comme http://google.de/hello%20World woops code>. Il reste encore à trouver un moyen élégant de gérer cela.
Cette solution n'a absolument rien à voir avec essayer de déterminer laquelle de l'évasion () ou de la codéveloppe () quelque chose a été codé avec ..
Merci pour @MIKA pour une bonne réponse. Peut-être qu'une seule amélioration depuis la fonction Unescape est considérée comme obsolète: } p> p>
Je n'ai pas le contrôle des données envoyées par nos clients et, comme je l'ai déjà dit, certains d'entre eux utilisent Escape () tandis que l'autre utilise le codeuromomponent (). Utiliser UNESCAPIER dans une chaîne codée avec un encodeur () générer des caractères mauvais et je veux éviter cela. Est une validation légale à regarder si la chaîne a simplement des séquences d'évacuation par paires, comme% XX% XX.
Enfin j'ai trouvé la réponse. Decoduricomponent décodera toujours des caractères échappés, car il utilise certaines conventions pour détecter chaque symbole si elle est codée dans UTF-8 ou ASCII. Toutefois, comme un client Swingley, si un client envoie des données codées à l'aide de l'évasion (), certaines données pourraient être perdues ou poignées. Donc, je lui donne le point.
Étant donné que Encodégonant () utilise l'encodage UTF-8 de caractères> = 128, vous pouvez utiliser la vérification du serveur des séquences UF-8 valides. Si les données contiennent des séquences UTF-8 non valides, les données ont été produites avec évasion () et vous devez probablement supposer qu'il est codé ISO-8859-1. Les octets des données ISO-8859-1 dans la pratique ne ressemblent jamais à des séquences UTF-8 valides.