Java - 将String转换为有效的URI对象

时间:2009-02-21 15:07:19

标签: java android encoding utf-8

我正在尝试从java.net.URI获取String个对象。该字符串有一些字符需要用它们的百分比转义序列替换。但是,当我使用URLEncoder对UTF-8编码的字符串进行编码时,即使/被替换为它们的转义序列。

如何从String对象中获取有效的编码URL?

http://www.google.com?q=a b 提供 http%3A%2F%2www.google.com ... ,而我希望输出为 {{ 3}}

有人可以告诉我如何实现这一目标。

我正在尝试在Android应用中执行此操作。所以我可以访问有限数量的库。

11 个答案:

答案 0 :(得分:55)

您可以尝试Apache commons-httpclient项目

中的org.apache.commons.httpclient.util.URIUtil.encodeQuery

像这样(见URIUtil):

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

将成为:

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

你当然可以自己做,但URI解析可能会变得非常混乱......

答案 1 :(得分:45)

Android一直将Uri类作为SDK的一部分: http://developer.android.com/reference/android/net/Uri.html

您可以简单地执行以下操作:

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

答案 2 :(得分:33)

我将在此处针对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类功能。

这种方法的优点在于,您可以使用任何有效的网址字符串,并且无需任何特殊知识就可以使用它。

答案 3 :(得分:14)

即使这是一个已经接受答案的旧帖子,我也会发布我的替代答案,因为它适用于当前的问题,似乎没有人提到这种方法。

使用java.net.URI库:

URI uri = URI.create(URLString);

如果你想要一个与之对应的URL格式的字符串:

String validURLString = uri.toASCIIString();

与许多其他方法(例如java.net.URLEncoder)不同,此方法仅替换不安全的ASCII字符(例如çé ...)。


在上面的示例中,如果URLString是以下String

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

结果validURLString将是:

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

这是一个格式正确的网址。

答案 4 :(得分:9)

答案 5 :(得分:4)

您可以使用URI类的多参数构造函数。来自URI javadoc:

  

多参数构造函数引用它们出现的组件所需的非法字符。百分比字符('%')始终由这些构造函数引用。保留任何其他字符。

所以如果你使用

URI uri = new URI("http", "www.google.com?q=a b");

然后你得到的http:www.google.com?q=a%20b不太正确,但距离更近了。

如果您知道您的字符串不会包含网址片段(例如http://example.com/page#anchor),那么您可以使用以下代码获取所需内容:

String s = "http://www.google.com?q=a b";
String[] parts = s.split(":",2);
URI uri = new URI(parts[0], parts[1], null);

为安全起见,您应该扫描字符串中的#个字符,但这应该可以让您入门。

答案 6 :(得分:4)

我的一个项目从字符串创建URI对象时遇到了类似的问题。我也找不到任何干净的解决方案。这就是我想出的:

public static URI encodeURL(String url) throws MalformedURLException, URISyntaxException  
{
    URI uriFormatted = null; 

    URL urlLink = new URL(url);
    uriFormatted = new URI("http", urlLink.getHost(), urlLink.getPath(), urlLink.getQuery(), urlLink.getRef());

    return uriFormatted;
}

您可以使用以下URI构造函数来指定端口(如果需要):

URI uri = new URI(scheme, userInfo, host, port, path, query, fragment);

答案 7 :(得分:3)

我尝试使用

String converted = URLDecoder.decode("toconvert","UTF-8");

我希望这是你真正想要的东西吗?

答案 8 :(得分:1)

java.net博客前几天有一个类可能已经完成了你想要的东西(但它现在已经关闭,所以我无法检查)。

这里的代码可能会被修改为你想做的事情:

http://svn.apache.org/repos/asf/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/UriBuilder.java

这是我在java.net中想到的那个:https://urlencodedquerystring.dev.java.net/

答案 9 :(得分:1)

也许你可以使用这个类:

http://developer.android.com/reference/java/net/URLEncoder.html

自API级别1起,Android中存在哪个。

然而,令人讨厌的是,它专门处理空格(用+而不是%20替换它们)。为了解决这个问题,我们只需使用这个片段:

URLEncoder.encode(value, "UTF-8").replace("+", "%20");

答案 10 :(得分:0)

我最终使用的是httpclient-4.3.6:

import org.apache.http.client.utils.URIBuilder;
public static void main (String [] args) {
    URIBuilder uri = new URIBuilder();
    uri.setScheme("http")
    .setHost("www.example.com")
    .setPath("/somepage.php")
    .setParameter("username", "Hello Günter")
    .setParameter("p1", "parameter 1");
    System.out.println(uri.toString());
}

输出将是:

http://www.example.com/somepage.php?username=Hello+G%C3%BCnter&p1=paramter+1