Voici ma méthode normale pour faire face à cela. Tout d'abord, puisque + est un cas spécial agaçant, je l'interdis dans le cadre de l'encodage. Si elles mettent un plus, c'est un plus, si elles veulent un espace, elles peuvent appuyer sur cette grande barre au bas de leur clavier. (Et oui, j'ai fait cela dans le cadre de certains contrats). Mais vraiment, vous pouvez l'expliquer en travaillant si dur pour votre client qu'il n'a pas besoin de s'inquiéter de l'encoder lui-même.
Ensuite, j'ai réécrit java.net.URLDecoder.decode
pour supprimer le cas «+». (Vraiment juste une question de couper et coller dans n'importe quelle classe d'utilité que j'utilise pour ce projet, et enlever ~ 4 lignes).
Ensuite, pour tout ce que je reçois, je le fais passer par le décodeur, puis l'encodeur. Cela va le décoder et le réencoder s'il est codé, ou l'encoder s'il n'est pas codé. J'ai reçu cette astuce de quelqu'un il y a quelques années, je ne me souviens pas qui donner un crédit approprié.
Alors je me retrouve avec:
String properlyencodedstring =
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8");
Le seul moment où cela peut avoir besoin de peaufinage serait dans le cas de données avec de grands groupes de urls devant être saisies et traitées, est que je passe mon hypothèse , utilisez input type="url"
(avec une sorte de polyfill javascript pour les anciens navigateurs), et prétraitez avec .replaceAll("+", " ")
, car il n'y aurait pas d'espaces autorisés à entrer dans ce cas. (Et selon toute vraisemblance, utilisez java.net.URI
à la place de toute façon)
J'ai voté pour vous. Changer de contrat a du sens – anjanb
Il est toujours préférable de ne pas deviner. – Rontologist
Il est impossible de détecter si l'utilisateur souhaite foo% 40test.com ou [email protected] s'il définit foo% 40test.com. Changer le contrat. – Horcrux7