URL url= new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString();
System.out.println(correctEncodedURL);
Impressions
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$
Que se passe-t-il ici?
1. Fractionnez l'URL en parties structurelles. Utilisez java.net.URL
pour cela.
2. Codez correctement chaque pièce structurelle!
3. Utilisez IDN.toASCII(putDomainNameHere)
pour Punycode encoder le nom d'hôte!
4. Utilisez java.net.URI.toASCIIString()
pour coder en pourcentage, unicode codé NFC - (mieux serait NFKC!). Pour plus d'informations, voir: Comment coder correctement cette URL
Dans certains cas, il est conseillé de vérifier si l'URL est déjà encodée . Remplacez également les espaces encodés '+' par des espaces encodés '% 20'.
Voici quelques exemples qui fonctionneront également correctement
{
"in" : "http://نامهای.com/",
"out" : "http://xn--mgba3gch31f.com/"
},{
"in" : "http://www.example.com/‥/foo",
"out" : "http://www.example.com/%E2%80%A5/foo"
},{
"in" : "http://search.barnesandnoble.com/booksearch/first book.pdf",
"out" : "http://search.barnesandnoble.com/booksearch/first%20book.pdf"
}, {
"in" : "http://example.com/query?q=random word £500 bank $",
"out" : "http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$"
}
La solution passe environ 100 des cas de test fournis par Web Plattform Tests .