10
votes

Comment détecter si une chaîne est codée avec évasion () ou encodeuroricomponent ()

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?


3 commentaires

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.


5 Réponses :



0
votes

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.


1 commentaires

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).



12
votes

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


0 commentaires

13
votes

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): XXX

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.


2 commentaires

Ça va échouer quand où est quelque chose que quelque chose en partiellement codé, comme http://google.de/hello%20World woops . 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 ..



2
votes

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: xxx

}


0 commentaires