9
votes

Comment analyser une uri comme ceci en Java

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(); }
  }


0 commentaires

7 Réponses :


14
votes

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"

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?

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 , selon l'exemple de la réponse de Baluscs à cette question.



-1
votes

D'accord, j'ai trouvé comment faire, comme ceci: XXX


0 commentaires

7
votes

Vous n'êtes-vous pas mieux à partir de Urlencoder que de coder de manière sélective des choses?


0 commentaires

7
votes

Vous devez utiliser java.net. URLENCODER à l'URL-encoder la requête avec utf-8 . 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? ;) xxx


0 commentaires

14
votes

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: xxx

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 ...

J'espère que cela aide quelqu'un, cela m'a fallu quelques heures pour le comprendre.


2 commentaires

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



3
votes

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);


1 commentaires

urldecoder.decode (requête, "utf-8") décodera AMPersand dans les valeurs de paramètre trop tôt



0
votes

Encodé d'abord votre URL, veuillez utiliser l'exemple suivant, puis transmettez l'URL dans la méthode xxx

// appel d'appel maintenant displayfileorurlinBrowser (crééjson); xxx


0 commentaires