J'essaie d'analyser l'URI suivant: http : //translate.google.com/#zh-cn | fr | Ľ
mais obtenu ce message d'erreur: P>
public static void displayFileOrUrlInBrowser(String File_Or_Url) { try { Desktop.getDesktop().browse(new URI(File_Or_Url.replace(" ","%20").replace("^","%5E"))); } catch (Exception e) { e.printStackTrace(); } }
7 Réponses :
Le caractère de tuyau est "considéré comme dangereux" pour utilisation en URL. Vous pouvez le réparer en remplaçant le | avec son équivalent hexagonal codé, qui serait "% 7c" p>
Cependant, le remplacement de caractères individuels dans une URL est une solution fragile qui ne fonctionne pas très bien lorsque vous considérez que, dans une URL donnée, il pourrait potentiellement être un certain nombre de caractères différents pouvant être remplacés. Vous remplacez déjà des espaces, des cigarettes et des tuyaux ... Mais qu'en est-il des crochets, des marques d'accent et des guillemets? Ou des points d'interrogation et des ampersands, qui peuvent ou non être des parties valides d'une URL, en fonction de la manière dont elles sont utilisées? P>
Ainsi, une solution supérieure serait d'utiliser l'installation de la langue pour encoder les URL, plutôt que de le faire manuellement. Dans le cas de Java, utilisez Urlencoder a >, selon l'exemple de la réponse de Baluscs à cette question. P>
FYI: URLENCoder code> (malgré le nom) ne doit pas être utilisé pour encoder les URL. Le document DOC dit: cette classe contient des méthodes statiques pour convertir une chaîne au format MIME de l'application / X-www-Form-URLencodé. I> Ce n'est pas identique à l'encodage utilisé par les URIS / URL.
La solution de Balusc semble fonctionner pour ce cas de l'URL, mais j'ai besoin de la méthode pour travailler pour toutes les URL que je passe, comment saillirait-il du point de départ pour analyser le reste de l'URL? L'URL puisse être utilisée par l'URL: www.yahoo.com/abc/xyz Yahoo.com/ABC/123 < / a> yahoo.com/abc/123 / ...
Je pense que vous auriez besoin de diviser l'URL en morceaux ... Domaine, chemin, chaîne de requête et fragment. Le domaine ne doit pas être codé. Le chemin, vous devriez vous séparer par des barres obliques et encoder chaque partie du chemin, puis le remettre ensemble. Pour la chaîne de requête, vous auriez besoin de coder chaque nom de paramètre et de valeur. Vous devrez également coder le fragment. Ensuite, remontez l'URL.
D'accord, j'ai trouvé comment faire, comme ceci:
Vous n'êtes-vous pas mieux à partir de Urlencoder que de coder de manière sélective des choses? p>
Vous devez utiliser java.net. URLENCODER code>
à l'URL-encoder la requête avec utf-8 code>. Vous n'avez pas nécessairement besoin de regex pour cela. Vous ne voulez pas avoir de regex pour couvrir tous ces milliers de glyphes chinois, n'est-ce pas? ;)
La solution Urlencoder n'a pas fonctionné pour moi, peut-être parce qu'elle code juste tout. J'essayais d'utiliser l'HTTPGET d'Apache et que cela jette une erreur avec une URL en tant que chaîne codée comme celle-ci.
La bonne voie dans mon cas était ce code étrange: p> URL.Touri ne fonctionne pas de la même manière. Les constructeurs d'URI fonctionnent de deux manières: si vous utilisez celui-ci avec un seul paramètre de chaîne, le constructeur prétend que l'URI fourni est correctement échappée (et donc l'erreur, la même chose se produit avec le constructeur de chaînes de httptt); Si vous utilisez le constructeur URI multiple Strings, la classe traite tout ce qui est très bien inscrété (et httptt a un autre constructeur acceptant une URI). Pourquoi URL.TOURI () ne fait pas cela? Je n'ai aucune idée ... p> J'espère que cela aide quelqu'un, cela m'a fallu quelques heures pour le comprendre. P> p>
C'est faux. Si l'URL contient des caractères codés, l'espace "% 20" par exemple, par exemple, il y aura non désiré "% 2520". Jetez un exemple d'exemple ici ou Ma question et ma réponse .
@Marekr j'ai pris le meilleur de vos deux réponses et les combine à Stackoverflow.com/a/22279061/14731
Prendre le meilleur de Réponse de Federico et La réponse de Marek , vous devez procéder comme suit:
URL url = new URL(pageURLAsUnescapedString); // URI's constructor expects the path, query string and fragment to be decoded. // If we do not decode them, we will end up with double-encoding. String path = url.getPath(); if (path != null) path = URLDecoder.decode(path, "UTF-8"); String query = url.getQuery(); if (query != null) query = URLDecoder.decode(query, "UTF-8"); String fragment = url.getRef(); if (fragment != null) fragment = URLDecoder.decode(fragment, "UTF-8"); URI uri = new URI(url.getProtocol(), url.getAuthority(), path, query, fragment);
urldecoder.decode (requête, "utf-8") code> décodera AMPersand dans les valeurs de paramètre trop tôt
Encodé d'abord votre URL, veuillez utiliser l'exemple suivant, puis transmettez l'URL dans la méthode // appel d'appel maintenant
displayfileorurlinBrowser (crééjson); p>