Java中的HTTP URL地址编码


366

我的Java独立应用程序从用户那里获取URL(指向文件),我需要点击它并下载它。我面临的问题是我无法正确编码HTTP URL地址...

例:

URL:  http://search.barnesandnoble.com/booksearch/first book.pdf

java.net.URLEncoder.encode(url.toString(), "ISO-8859-1");

返回我:

http%3A%2F%2Fsearch.barnesandnoble.com%2Fbooksearch%2Ffirst+book.pdf

但是,我想要的是

http://search.barnesandnoble.com/booksearch/first%20book.pdf

(空格替换为%20)

我猜URLEncoder不是为了对HTTP URL进行编码而设计的。JavaDoc说“用于HTML表单编码的实用程序类”。还有其他方法可以做到这一点吗?



该行为是完全正确的。URL编码是将某些内容转换为可以安全地作为URL参数传递的字符串,而根本不能解释为URL。而您希望它仅转换URL的一小部分。
Stephen Holt

Answers:


303

java.net.URI中的类可以帮助; 在您找到的URL文档中

注意,URI类在某些情况下确实对其组件字段进行转义。建议的管理URL编码和解码的方法是使用URI

使用具有多个参数的构造函数之一,例如:

URI uri = new URI(
    "http", 
    "search.barnesandnoble.com", 
    "/booksearch/first book.pdf",
    null);
URL url = uri.toURL();
//or String request = uri.toString();

(URI的单参数构造函数不会转义非法字符)


上面的代码仅对非法字符进行转义-不会对非ASCII字符进行转义(请参见fatih的注释)。
toASCIIString方法可用于获取仅具有US-ASCII字符的字符串:

URI uri = new URI(
    "http", 
    "search.barnesandnoble.com", 
    "/booksearch/é",
    null);
String request = uri.toASCIIString();

对于查询类似的URL http://www.google.com/ig/api?weather=São Paulo,请使用构造函数的5参数版本:

URI uri = new URI(
        "http", 
        "www.google.com", 
        "/ig/api",
        "weather=São Paulo",
        null);
String request = uri.toASCIIString();

13
请注意,这里提到的URI类来自“ org.apache.commons.httpclient.URI”而不是“ java.net”,“ java.net”并非URI不接受非法字符,除非您将使用从其组件构建URL的构造函数,如下面的Matt评论中提到的方式
Mohamed Faramawi 2010年

7
@Mohamed:我提到并用于测试的类实际上是 java.net.URI:它工作得很好(Java 1.6)。如果不是标准Java名称,我会提到完全限定的类名称,并且该链接指向的文档java.net.URI。并且,通过Sudhakar的评论,它解决了这个问题,而没有包含任何“公共库”!
user85421'6

1
URI uri = new URI(“ http”,“ search.barnesandnoble.com”,“ / booksearch /é”,null); 不对此样本进行正确的转义吗?这本应该以%逃逸率逃逸的
fmucar 2011年

@fatih-没错,谢谢!通常,这应该不成问题,但是有一个简单的解决方案-几乎与我之前写的相同。参见第二次编辑。
user85421 2011年

@Carlos Thx进行编辑。现在它确实可以逃脱,但不能正确转义。应该为Path参数的char的HEX值添加%,这意味着
échar

91

请注意,以上大多数答案都不正确。

URLEncoder级,尽管是名,是不是有什么需要到这里来。不幸的是,Sun如此讨厌地命名了这个班。 URLEncoder是用于将数据作为参数传递,而不是用于编码URL本身。

换句话说,"http://search.barnesandnoble.com/booksearch/first book.pdf"是URL。参数例如是"http://search.barnesandnoble.com/booksearch/first book.pdf?parameter1=this&param2=that"。参数就是您要使用的参数URLEncoder

以下两个示例突出显示了两者之间的区别。

根据HTTP标准,以下内容会产生错误的参数。请注意,与号(&)和加号(+)的编码不正确。

uri = new URI("http", null, "www.google.com", 80, 
"/help/me/book name+me/", "MY CRZY QUERY! +&+ :)", null);

// URI: http://www.google.com:80/help/me/book%20name+me/?MY%20CRZY%20QUERY!%20+&+%20:)

以下将产生正确的参数,并正确编码查询。请注意空格,&符和加号。

uri = new URI("http", null, "www.google.com", 80, "/help/me/book name+me/", URLEncoder.encode("MY CRZY QUERY! +&+ :)", "UTF-8"), null);

// URI: http://www.google.com:80/help/me/book%20name+me/?MY+CRZY+QUERY%2521+%252B%2526%252B+%253A%2529

2
没错,根据文档docs.oracle.com/javase/1.4.2/docs/api/java/net/…,URI构造函数已经对查询字符串进行了编码,java.lang.String,java.lang.String,int ,java.lang.String,java.lang.String,java.lang.String)
madoke 2012年

8
@Draemon答案是正确的,但是以一种不常见的方式使用查询字符串。一个更正常的例子是query = URLEncoder.encode(key) + "=" + URLEncoder.encode(value)。文档只说“引用了不是合法URI字符的任何字符”。
tc。

1
我在这里同意马特的观点。如果您在浏览器中输入以下网址:“ google.com/help/me/book name + me /?MY CRZY QUERY!+&+ :)”,它将自动对空格进行编码,但是“&”用作查询值分隔符和“ +”将丢失。
arcot 2014年

80

我将在这里针对Android用户添加一个建议。您可以这样做,避免了必须获取任何外部库的情况。另外,以上某些答案中建议的所有搜索/替换字符解决方案都是危险的,应避免使用。

试试看:

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

您可以看到,在此特定的URL中,我需要对那些空格进行编码,以便可以将其用于请求。

这利用了Android类中提供的几个功能。首先,URL类可以将url分解为其适当的组成部分,因此您无需进行任何字符串搜索/替换工作。其次,当您通过组件而不是从单个字符串构造URI时,此方法利用了URI类功能,可以正确地对组件进行转义。

这种方法的优点在于,您可以接受任何有效的url字符串并使它工作,而无需您自己对此有任何特殊的了解。


3
不错的方法,但是我想指出的是,此代码不会阻止双重编码,例如%20被编码为%2520。斯科特的答案不会因此而受苦。
nattster 2014年

2
它无法处理#
Alston 2014年

或者,如果您只想引用路径:new URI(null,null,“ /空格路径”,null,null).toString()
user1050755 2014年

1
@Stallman如果您的文件名包含#,则URL类会将其放入“ ref”(相当于URI类中的“ fragment”)。您可以检测URL.getRef()是否返回可能被视为路径一部分的内容,并将URL.getPath()+“#” + URL.getRef()作为“ path”参数传递,将null传递给“ fragment” ” URI类7参数构造函数的参数。默认情况下,#之后的字符串被视为参考(或锚点)。
gouessej 2016年

49

我开发的解决方案,比其他任何解决方案都稳定得多:

public class URLParamEncoder {

    public static String encode(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isUnsafe(ch)) {
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));
            } else {
                resultStr.append(ch);
            }
        }
        return resultStr.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;
    }

}

3
这也需要您将网址分成多个部分。计算机无法知道要编码的网址的哪一部分。参见我上面的编辑
fmucar 2011年

4
@fmucar感谢您提供的这段代码!请注意,这不是UTF-8。要获得UTF-8只是预处理与输入String utf8Input = new String(Charset.forName("UTF-8").encode(input).array());(摘自这里
letmaik

1
实际上,此解决方案还将“ http://”部分编码为“ http%3A%2F%2F”,这是最初的问题试图避免的内容。
本杰明·皮耶特

2
您只传递需要编码的内容,而不传递整个URL。无法传递一个完整的URL字符串并期望正确的编码。在所有情况下,您都需要将网址分解为逻辑部分。
fmucar 2013年

2
我对此答案有疑问,因为它不会将不安全的字符编码为UTF-8。虽然可能取决于对等应用程序。
Tarnschaf 2013年

36

如果有URL,则可以将url.toString()传递给此方法。首先进行解码,以避免双重编码(例如,对空格进行编码将导致%20,对百分号进行编码将导致%25,因此双重编码会将空格变为%2520)。然后,按照上述说明使用URI,并添加URL的所有部分(这样就不会删除查询参数)。

public URL convertToURLEscapingIllegalCharacters(String string){
    try {
        String decodedURL = URLDecoder.decode(string, "UTF-8");
        URL url = new URL(decodedURL);
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
        return uri.toURL(); 
    } catch (Exception ex) {
        ex.printStackTrace();
        return null;
    }
}

1
当您将字符串传递为“ google.co.in/search?q=123%!123 ” 时,URLDecoder.decode(string,“ UTF-8”)失败,并出现IllegalArgumentException 。这是一个有效的URL。我猜想将%用作数据而不是编码字符时,此API无效。
2015年

26

是的,URL编码将对该字符串进行编码,以便将其正确地通过URL传递到最终目标。例如,您可能没有http://stackoverflow.com?url=http://yyy.com。UrlEncoding参数将修复该参数值。

所以我有两个选择供您选择:

  1. 您是否有权访问与域分开的路径?如果是这样,您也许可以简单地对路径进行UrlEncode。但是,如果不是这种情况,那么选项2可能适合您。

  2. 获取commons-httpclient-3.1。这有一个URIUtil类:

    System.out.println(URIUtil.encodePath(“ http://example.com/x y”,“ ISO-8859-1”));

这将完全输出您要查找的内容,因为它将仅对URI的路径部分进行编码。

仅供参考,您需要使用commons-codec和commons-logging才能使此方法在运行时起作用。


Sidenote Apache Commons显然已停止在4.x分支中维护URIUtil,建议您改用JDK的URI类。只是意味着您必须自己分解字符串。
Nicholi 2014年

2)正是在这里也建议使用stackoverflow.com/questions/5330104/…我也使用了URIUtil解决方案
致Kra


11

不幸的是,org.apache.commons.httpclient.util.URIUtil不赞成使用,并且replacement org.apache.commons.codec.net.URLCodecdos编码适合于表单帖子,而不是实际的URL中。因此,我不得不编写自己的函数,该函数具有单个组件(不适用于具有?和&的整个查询字符串)

public static String encodeURLComponent(final String s)
{
  if (s == null)
  {
    return "";
  }

  final StringBuilder sb = new StringBuilder();

  try
  {
    for (int i = 0; i < s.length(); i++)
    {
      final char c = s.charAt(i);

      if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')) ||
          ((c >= '0') && (c <= '9')) ||
          (c == '-') ||  (c == '.')  || (c == '_') || (c == '~'))
      {
        sb.append(c);
      }
      else
      {
        final byte[] bytes = ("" + c).getBytes("UTF-8");

        for (byte b : bytes)
        {
          sb.append('%');

          int upper = (((int) b) >> 4) & 0xf;
          sb.append(Integer.toHexString(upper).toUpperCase(Locale.US));

          int lower = ((int) b) & 0xf;
          sb.append(Integer.toHexString(lower).toUpperCase(Locale.US));
        }
      }
    }

    return sb.toString();
  }
  catch (UnsupportedEncodingException uee)
  {
    throw new RuntimeException("UTF-8 unsupported!?", uee);
  }
}

来吧,必须有一个图书馆来做到这一点。
shinzou

9

不幸的是,URLEncoding可以对HTTP URL进行编码。您传入的字符串“ http://search.barnesandnoble.com/booksearch/first book.pdf”已正确完整地编码为URL编码形式。您可以将返回的整个gobbledigook长字符串作为参数传递给URL,然后可以将其解码回正好传递给您的字符串。

听起来您想要做的事情与将整个URL作为参数传递有所不同。根据我的收集,您正在尝试创建一个看起来像“ http://search.barnesandnoble.com/booksearch/whateverTheUserPassesIn ” 的搜索URL 。您唯一需要编码的就是“ whateverTheUserPassesIn”位,因此也许您需要做的就是这样:

String url = "http://search.barnesandnoble.com/booksearch/" + 
       URLEncoder.encode(userInput,"UTF-8");

那应该为您带来更有效的东西。


17
这样会将userInput中的空格替换为“ +”。发布者需要将它们替换为“%20”。
vocaro

@vocaro:这是一个很好的观点。URLEncoder转义就像参数是查询参数一样,而不是URL的其余部分。
Brandon Yarbrough 2014年

9

如果任何人不想为其项目添加依赖项,这些功能可能会有所帮助。

我们将URL的“路径”部分传递到此处。您可能不想将完整的URL作为参数传递(查询字符串需要不同的转义符,等等)。

/**
 * Percent-encodes a string so it's suitable for use in a URL Path (not a query string / form encode, which uses + for spaces, etc)
 */
public static String percentEncode(String encodeMe) {
    if (encodeMe == null) {
        return "";
    }
    String encoded = encodeMe.replace("%", "%25");
    encoded = encoded.replace(" ", "%20");
    encoded = encoded.replace("!", "%21");
    encoded = encoded.replace("#", "%23");
    encoded = encoded.replace("$", "%24");
    encoded = encoded.replace("&", "%26");
    encoded = encoded.replace("'", "%27");
    encoded = encoded.replace("(", "%28");
    encoded = encoded.replace(")", "%29");
    encoded = encoded.replace("*", "%2A");
    encoded = encoded.replace("+", "%2B");
    encoded = encoded.replace(",", "%2C");
    encoded = encoded.replace("/", "%2F");
    encoded = encoded.replace(":", "%3A");
    encoded = encoded.replace(";", "%3B");
    encoded = encoded.replace("=", "%3D");
    encoded = encoded.replace("?", "%3F");
    encoded = encoded.replace("@", "%40");
    encoded = encoded.replace("[", "%5B");
    encoded = encoded.replace("]", "%5D");
    return encoded;
}

/**
 * Percent-decodes a string, such as used in a URL Path (not a query string / form encode, which uses + for spaces, etc)
 */
public static String percentDecode(String encodeMe) {
    if (encodeMe == null) {
        return "";
    }
    String decoded = encodeMe.replace("%21", "!");
    decoded = decoded.replace("%20", " ");
    decoded = decoded.replace("%23", "#");
    decoded = decoded.replace("%24", "$");
    decoded = decoded.replace("%26", "&");
    decoded = decoded.replace("%27", "'");
    decoded = decoded.replace("%28", "(");
    decoded = decoded.replace("%29", ")");
    decoded = decoded.replace("%2A", "*");
    decoded = decoded.replace("%2B", "+");
    decoded = decoded.replace("%2C", ",");
    decoded = decoded.replace("%2F", "/");
    decoded = decoded.replace("%3A", ":");
    decoded = decoded.replace("%3B", ";");
    decoded = decoded.replace("%3D", "=");
    decoded = decoded.replace("%3F", "?");
    decoded = decoded.replace("%40", "@");
    decoded = decoded.replace("%5B", "[");
    decoded = decoded.replace("%5D", "]");
    decoded = decoded.replace("%25", "%");
    return decoded;
}

并测试:

@Test
public void testPercentEncode_Decode() {
    assertEquals("", percentDecode(percentEncode(null)));
    assertEquals("", percentDecode(percentEncode("")));

    assertEquals("!", percentDecode(percentEncode("!")));
    assertEquals("#", percentDecode(percentEncode("#")));
    assertEquals("$", percentDecode(percentEncode("$")));
    assertEquals("@", percentDecode(percentEncode("@")));
    assertEquals("&", percentDecode(percentEncode("&")));
    assertEquals("'", percentDecode(percentEncode("'")));
    assertEquals("(", percentDecode(percentEncode("(")));
    assertEquals(")", percentDecode(percentEncode(")")));
    assertEquals("*", percentDecode(percentEncode("*")));
    assertEquals("+", percentDecode(percentEncode("+")));
    assertEquals(",", percentDecode(percentEncode(",")));
    assertEquals("/", percentDecode(percentEncode("/")));
    assertEquals(":", percentDecode(percentEncode(":")));
    assertEquals(";", percentDecode(percentEncode(";")));

    assertEquals("=", percentDecode(percentEncode("=")));
    assertEquals("?", percentDecode(percentEncode("?")));
    assertEquals("@", percentDecode(percentEncode("@")));
    assertEquals("[", percentDecode(percentEncode("[")));
    assertEquals("]", percentDecode(percentEncode("]")));
    assertEquals(" ", percentDecode(percentEncode(" ")));

    // Get a little complex
    assertEquals("[]]", percentDecode(percentEncode("[]]")));
    assertEquals("a=d%*", percentDecode(percentEncode("a=d%*")));
    assertEquals(")  (", percentDecode(percentEncode(")  (")));
    assertEquals("%21%20%2A%20%27%20%28%20%25%20%29%20%3B%20%3A%20%40%20%26%20%3D%20%2B%20%24%20%2C%20%2F%20%3F%20%23%20%5B%20%5D%20%25",
                    percentEncode("! * ' ( % ) ; : @ & = + $ , / ? # [ ] %"));
    assertEquals("! * ' ( % ) ; : @ & = + $ , / ? # [ ] %", percentDecode(
                    "%21%20%2A%20%27%20%28%20%25%20%29%20%3B%20%3A%20%40%20%26%20%3D%20%2B%20%24%20%2C%20%2F%20%3F%20%23%20%5B%20%5D%20%25"));

    assertEquals("%23456", percentDecode(percentEncode("%23456")));

}

谢谢你,但是我需要做什么来编码一个空格->按照你的例子使用%20代替?
N00b Pr0grammer

更新以将空间计为%20
Cuga

7

如果您的URL中有编码的“ /”(%2F),仍然存在问题。

RFC 3986-第2.2节说:“如果URI组件的数据与保留字符作为定界符的目的发生冲突,则必须在形成URI之前对冲突的数据进行百分比编码。” (RFC 3986-第2.2节)

但是Tomcat存在一个问题:

http://tomcat.apache.org/security-6.html-在Apache Tomcat 6.0.10中已修复

重要说明:目录遍历CVE-2007-0450

Tomcat允许使用'\','%2F'和'%5C'[...]。

以下Java系统属性已添加到Tomcat中,以提供对URL中路径分隔符的处理的附加控制(两个选项均默认为false):

  • org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:true | false
  • org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:true | false

由于无法保证所有URL都像在代理服务器中一样由Tomcat处理,因此应始终对Tomcat进行保护,就像没有使用任何代理服务器来限制上下文访问一样。

影响:6.0.0-6.0.9

因此,如果您拥有带有%2F字符的URL,则Tomcat返回:“ 400 Invalid URI:noSlash”

您可以在Tomcat启动脚本中切换错误修正:

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%   -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true 

7

我阅读了先前的答案以编写自己的方法,因为使用先前答案的解决方案无法正常工作,这对我来说看起来不错,但是如果您发现无法解决此问题的网址,请告诉我。

public static URL convertToURLEscapingIllegalCharacters(String toEscape) throws MalformedURLException, URISyntaxException {
            URL url = new URL(toEscape);
            URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
            //if a % is included in the toEscape string, it will be re-encoded to %25 and we don't want re-encoding, just encoding
            return new URL(uri.toString().replace("%25", "%"));
}

4

我同意马特的观点。的确,我从未在教程中很好地解释过它,但是一个问题是如何对URL路径进行编码,而另一个非常不同的问题是如何对附加在URL后面的参数(“?”后面的查询部分)进行编码。 “符号)。它们使用相似的编码,但不相同。

特别用于空白字符的编码。URL路径需要将其编码为%20,而查询部分允许%20以及“ +”号。最好的想法是使用Web浏览器在我们的Web服务器上自己对其进行测试。

对于这两种情况,我总是COMPONENT BY COMPONENT编码,而不是整个字符串。实际上,URLEncoder允许将其用于查询部分。对于路径部分,您可以使用类URI,尽管在这种情况下,它需要整个字符串,而不是单个组件。

无论如何,我相信避免这些问题的最佳方法是使用个人非冲突设计。怎么样?例如,我永远不会使用aZ,AZ,0-9和_之外的其他字符来命名目录或参数。这样,唯一的需要是对每个参数的值进行编码,因为它可能来自用户输入并且所使用的字符是未知的。


2
在问题中使用URL的示例代码将是一件好事
Martin Serrano 2012年


3

您还可以使用GUAVA和路径转义符: UrlEscapers.urlFragmentEscaper().escape(relativePath)


2

除了Carlos Heuberger的答复:如果需要与默认值(80)不同,则应使用7参数构造函数:

URI uri = new URI(
        "http",
        null, // this is for userInfo
        "www.google.com",
        8080, // port number as int
        "/ig/api",
        "weather=São Paulo",
        null);
String request = uri.toASCIIString();

2

我把上面的内容改了一下。我首先喜欢肯定的逻辑,并且我认为HashSet可能比其他一些选项(例如,搜索字符串)提供更好的性能。虽然,我不确定自动装箱的代价是否值得,但是如果编译器针对ASCII字符进行优化,那么装箱的成本将很低。

/***
 * Replaces any character not specifically unreserved to an equivalent 
 * percent sequence.
 * @param s
 * @return
 */
public static String encodeURIcomponent(String s)
{
    StringBuilder o = new StringBuilder();
    for (char ch : s.toCharArray()) {
        if (isSafe(ch)) {
            o.append(ch);
        }
        else {
            o.append('%');
            o.append(toHex(ch / 16));
            o.append(toHex(ch % 16));
        }
    }
    return o.toString();
}

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

// https://tools.ietf.org/html/rfc3986#section-2.3
public static final HashSet<Character> UnreservedChars = new HashSet<Character>(Arrays.asList(
        'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
        '0','1','2','3','4','5','6','7','8','9',
        '-','_','.','~'));
public static boolean isSafe(char ch)
{
    return UnreservedChars.contains(ch);
}

1

使用以下标准Java解决方案(通过了Web Plattform Tests提供的大约100个测试用例):

0. 测试URL是否已经被编码

1.将 URL分成结构部分。使用java.net.URL 它。

2. 正确编码每个结构部分!

3.使用IDN.toASCII(putDomainNameHere)的Punycode编码的主机名!

4.用于java.net.URI.toASCIIString()对NFC编码的unicode进行百分比编码(最好是NFKC!)。

在此处查找更多信息:https : //stackoverflow.com/a/49796882/1485527


0

我创建了一个新项目来帮助构造HTTP URL。该库将自动对路径段和查询参数进行URL编码。

您可以在https://github.com/Widen/urlbuilder上查看源代码并下载二进制文件。

此问题中的示例URL:

new UrlBuilder("search.barnesandnoble.com", "booksearch/first book.pdf").toString()

产生

http://search.barnesandnoble.com/booksearch/first%20book.pdf


0

我有同样的问题。通过取消唱歌解决了这个问题:

android.net.Uri.encode(urlString, ":/");

它对字符串进行编码,但跳过“:”和“ /”。


0

我用这个

org.apache.commons.text.StringEscapeUtils.escapeHtml4("my text % & < >");

添加这个依赖

 <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-text</artifactId>
        <version>1.8</version>
    </dependency>

-2

我开发了一个满足此目的的库:galimatias。它以与网络浏览器相同的方式解析URL。也就是说,如果URL在浏览器中可用,则galimatias会正确解析该URL

在这种情况下:

// Parse
io.mola.galimatias.URL.parse(
    "http://search.barnesandnoble.com/booksearch/first book.pdf"
).toString()

将给您:http://search.barnesandnoble.com/booksearch/first%20book.pdf。当然,这是最简单的情况,但是它将适用于任何其他方法java.net.URI

您可以在以下位置查看它:https : //github.com/smola/galimatias


-3

您可以使用这样的功能。完成并根据您的需要进行修改:

/**
     * Encode URL (except :, /, ?, &, =, ... characters)
     * @param url to encode
     * @param encodingCharset url encoding charset
     * @return encoded URL
     * @throws UnsupportedEncodingException
     */
    public static String encodeUrl (String url, String encodingCharset) throws UnsupportedEncodingException{
            return new URLCodec().encode(url, encodingCharset).replace("%3A", ":").replace("%2F", "/").replace("%3F", "?").replace("%3D", "=").replace("%26", "&");
    }

使用示例:

String urlToEncode = ""http://www.growup.com/folder/intérieur-à_vendre?o=4";
Utils.encodeUrl (urlToEncode , "UTF-8")

结果是:http : //www.growup.com/folder/int%C3%A9rieur-%C3%A0_vendre?o=4


1
没有URLCodec,此答案是不完整的。
2014年

支持.replace()链接,这并不理想,但对于基本的临时用例就足够了
svarog


-7

怎么样:

public String UrlEncode(String in_){

String retVal = "";

try {
    retVal = URLEncoder.encode(in_, "UTF8");
} catch (UnsupportedEncodingException ex) {
    Log.get().exception(Log.Level.Error, "urlEncode ", ex);
}

return retVal;

}


URLEncoder不能用于转义无效的URL字符。仅用于编码形式。
阿彻2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.