71 votes

Java - convertit une Chaîne de URI valide de l'objet

Je suis en train d'essayer d'obtenir un java.net.URI objet à partir d'un String. La chaîne a certains personnages qui devront être remplacés par leur pourcentage de séquences d'échappement. Mais quand j'utilise URLEncoder pour encoder la Chaîne avec l'encodage UTF-8, même les / sont remplacées par leurs séquences d'échappement.

Comment puis-je obtenir un valide URL encodée à partir d'un objet de type String?

http://www.google.com?q=a b donne http%3A%2F%2www.google.com... alors que je veux que la sortie de la http://www.google.com?q=a%20b

Quelqu'un peut-il me dire comment faire pour y parvenir.

Je suis en train de le faire dans une application Android. J'ai donc accès à un nombre limité de bibliothèques.

56voto

Hans Doggen Points 878

Vous pourriez essayer: org.apache.commons.httpclient.util.URIUtil.encodeQuery dans Apache commons-httpclient projet

Comme ceci (voir URIUtil):

URIUtil.encodeQuery("http://www.google.com?q=a b")

deviendra:

http://www.google.com?q=a%20b

Vous pouvez bien sûr la faire vous-même, mais URI de l'analyse peut obtenir assez salissante...

45voto

bensnider Points 2709

Android a toujours eu la classe Uri dans le cadre du SDK: http://developer.android.com/reference/android/net/Uri.html

Vous pouvez simplement faire quelque chose comme:

String requestURL = String.format("http://www.example.com/?a=%s&b=%s", Uri.encode("foo bar"), Uri.encode("100% fubar'd"));

33voto

Craig B Points 2373

Je vais ajouter une suggestion ici visant à les utilisateurs d'Android. Vous pouvez faire ce qui évite d'avoir à obtenir toutes les bibliothèques externes. Aussi, tout le rechercher/remplacer des caractères les solutions proposées dans les réponses ci-dessus sont dangereuses et doivent être évités.

Donner à ceci un essai:

String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();

Vous pouvez voir que dans cette URL, j'ai besoin d'avoir ces espaces codés de façon à ce que je peux l'utiliser pour une demande.

Cette méthode tire parti d'un couple de fonctionnalités disponibles sur l'Android classes. Tout d'abord, l'URL de la classe de rompre une url dans ses composants, donc il n'est pas nécessaire pour vous de faire une chaîne de recherche/remplacer le travail. Deuxièmement, cette approche tire parti de la classe URI fonction de correctement s'échapper de composants lorsque vous construisez une URI via des composants plutôt que d'une seule chaîne.

La beauté de cette approche est que vous pouvez prendre n'importe quelle chaîne d'url valide et qu'il fonctionne sans avoir besoin d'aucune connaissance spéciale de vous-même.

14voto

dgiugg Points 357

Même si c'est un vieux post avec une déjà accepté de répondre, je poste mon alternative réponse, car elle fonctionne bien pour la présente question et il semble que personne n'a mentionné cette méthode.

Avec le java.net.URI de la bibliothèque:

URI uri = URI.create(URLString);

Et si vous voulez une URL formatée chaîne de caractères correspondant à:

String validURLString = uri.toASCIIString();

Contrairement à beaucoup d'autres méthodes (par exemple, java.net.URLEncoder), celui-ci remplace seulement dangereux caractères ASCII (comme ç, é...).


Dans l'exemple ci-dessus, si URLString est la suivante String:

"http://www.domain.com/façon+word"

le résultant validURLString sera:

"http://www.domain.com/fa%C3%A7on+word"

qui est un format d'URL.

9voto

Tim Cooper Points 2481

Si vous n'aimez pas les bibliothèques, comment à ce sujet?

Notez que vous ne devez pas utiliser cette fonction sur l'ensemble de l'URL, vous devez plutôt utiliser sur les composants...par exemple, juste le "b" de la composante, comme vous acquérir de l'URL - sinon l'ordinateur ne saura pas ce que les personnages sont censés avoir une signification spéciale et ceux qui sont censés avoir un sens littéral.

/** Converts a string into something you can safely insert into a URL. */
public static String encodeURIcomponent(String s)
{
    StringBuilder o = new StringBuilder();
    for (char ch : s.toCharArray()) {
        if (isUnsafe(ch)) {
            o.append('%');
            o.append(toHex(ch / 16));
            o.append(toHex(ch % 16));
        }
        else o.append(ch);
    }
    return o.toString();
}

private static char toHex(int ch)
{
    return (char)(ch < 10 ? '0' + ch : 'A' + ch - 10);
}

private static boolean isUnsafe(char ch)
{
    if (ch > 128 || ch < 0)
        return true;
    return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X