Comment détecter si une chaîne est codé avec escape() ou encodeURIComponent()
J'ai un service web qui reçoit des données à partir de divers clients. Certains d'entre eux envoie les données codées à l'aide d'échappement(), tandis que les autres utilisent plutôt encodeURIComponent(). Est-il un moyen de détecter le type d'encodage utilisé pour échapper aux données?
Pourquoi avez-vous besoin de savoir?
Je n'ai pas de contrôle des données envoyées par nos clients, et comme je l'ai dit avant, certains d'entre eux utilisent escape (), tandis que les autres utilisent encodeURIComponent() à la place. À l'aide de ne pas encoder dans une chaîne de caractères codés avec encodeURIComponent() générer des mauvais caractères, et je veux éviter. Est une validation juridique pour voir si la chaîne a est des séquences d'échappement en paires, en %xx%xx.
Enfin j'ai trouvé la réponse. decodeURIComponent toujours échappé à décoder les caractères, car il utilise certaines conventions de détecter pour chaque symbole si c'est de l'encodage en utf-8 ou ascii. Cependant, comme Swingley commentaires, si un client envoie des données codées à l'aide d'escape(), certaines données pourraient être perdues ou tronqués. Donc, je donne le point à lui.
Depuis encodeURIComponent() utilise l'encodage UTF-8 de caractères >= 128, vous pouvez sur le côté serveur de vérifier la validité des séquences UTF-8. Si les données contiennent des invalides séquences UTF-8, les données ont été produites à l'évasion() et vous avez probablement suppose que c'est de l'ISO-8859-1 codé. Octets de l'ISO-8859-1 de données, dans la pratique, jamais ne regarde comme valables des séquences UTF-8.
Je n'ai pas de contrôle des données envoyées par nos clients, et comme je l'ai dit avant, certains d'entre eux utilisent escape (), tandis que les autres utilisent encodeURIComponent() à la place. À l'aide de ne pas encoder dans une chaîne de caractères codés avec encodeURIComponent() générer des mauvais caractères, et je veux éviter. Est une validation juridique pour voir si la chaîne a est des séquences d'échappement en paires, en %xx%xx.
Enfin j'ai trouvé la réponse. decodeURIComponent toujours échappé à décoder les caractères, car il utilise certaines conventions de détecter pour chaque symbole si c'est de l'encodage en utf-8 ou ascii. Cependant, comme Swingley commentaires, si un client envoie des données codées à l'aide d'escape(), certaines données pourraient être perdues ou tronqués. Donc, je donne le point à lui.
Depuis encodeURIComponent() utilise l'encodage UTF-8 de caractères >= 128, vous pouvez sur le côté serveur de vérifier la validité des séquences UTF-8. Si les données contiennent des invalides séquences UTF-8, les données ont été produites à l'évasion() et vous avez probablement suppose que c'est de l'ISO-8859-1 codé. Octets de l'ISO-8859-1 de données, dans la pratique, jamais ne regarde comme valables des séquences UTF-8.
OriginalL'auteur Rodrigo | 2009-08-14
Vous devez vous connecter pour publier un commentaire.
Encouragez vos clients à utiliser encodeURIComponent(). Voir cette page pour une explication: En comparant escape(), encodeURI(), et encodeURIComponent(). Si vous voulez vraiment essayer de comprendre exactement comment la chose a été codé, vous pouvez essayer de regarder pour certains des caractères d'échappement() et encodeURI() ne codent pas.
aussi, peut-être quelque chose comme:
function isEncoded(str){return decodeURIComponent(str) !== str;}
merci pour votre idée, il a travaillé pour moi. 🙂
OriginalL'auteur Derek Swingley
Ce n'est pas aider à la côté serveur, mais dans le côté client, j'ai utilisé exceptions javascript pour détecter si le codage d'url a produit ISO Latin ou le codage UTF8.
decodeURIComponent
déclenche une exception non valides UTF8 séquences.Par exemple, la norme ISO Latin codé tréma 'ä'
%E4
lèvera une exception dans Firefox, mais UTF8 codé 'ä'%C3%A4
ne sera pas.Voir Aussi
OriginalL'auteur mika
Je réalise que c'est une vieille question, mais je ne suis pas au courant d'une meilleure solution. Donc, je fais comme ça (grâce à un commentaire par RobertPitt ci-dessus):
Je n'ai pas encore rencontré un cas où cela n'a pas. Ce qui ne veut pas dire que le cas n'existe pas. Peut-être que quelqu'un pourrait jeter quelque lumière sur ce point.
http://google.de/hello%20world woops
. Reste encore à trouver un moyen élégant pour gérer cela.Cette solution n'a absolument rien à voir avec le fait d'essayer de déterminer qui de l'évasion() ou encodeURIComponent() quelque chose a été codé avec..
OriginalL'auteur Dejan Janjušević
Merci pour @mika pour la grande réponse. Peut-être juste une amélioration, car ne pas encoder la fonction est considérée comme obsolète:
}
OriginalL'auteur Dudi
Vous n'avez pas à les différencier. escape() est appelée pour cent de l'encodage, il ne se distingue de l'encodage des URI dans la façon dont certains caractères code. Par exemple, l'Espace est codé que 20% à s'échapper mais en + avec l'encodage des URI. Une fois décodé, vous obtenez toujours la même valeur.
OriginalL'auteur ZZ Coder