android字符串转换成uri,关于android:Java-将字符串转换为有效的URI对象

我试图从String获取一个java.net.URI对象。 该字符串包含一些字符,需要用其百分比转义序列代替。 但是,当我使用URLEncoder以UTF-8编码对String进行编码时,即使将/替换为其转义序列。

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

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

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

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

您可以尝试: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解析会变得非常混乱。

谢谢汉斯。我正在尝试在Android应用程序中执行此操作。因此,我可以访问数量有限的库。你有什么其他的建议?再次感谢

也许您可以看看URIUtil类的源代码(毕竟它是开源的)。我认为可以从该类中提取必要的代码。

明确的项目(Apache commons-httpclient)"生命已尽头"。它已部分替换为HttpComponents-httpclient,但我无法在新API中找到等效的方法。

我同意dgiugg。答案已过时。

对于新版本的apache commits -httpclient,它似乎不存在

stackoverflow.com/questions/2605757/

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

很好的建议-谢谢

非常感谢!有时找到一个简单的Java函数需要花费多长时间!

不幸的是,当尝试对正斜杠(" /")进行编码时,encode()方法很糟糕。我只是用一个普通的旧String.replace()来完成工作。真是太la脚了... searchQuery.replace(" /","%2f");

我将在这里针对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字符串并使它工作,而无需您自己对此有任何特殊的了解。

即使这是一个已经接受了答案的旧帖子,我也会发布我的替代答案,因为它在当前问题上效果很好,而且似乎没有人提到此方法。

使用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"

这是格式正确的网址。

您的答案是我一直在寻找的答案,由于各种原因,我无法提取参数,这是唯一有效的方法。

每个人在处理异常时也应该看一下文档developer.android.com/reference/java/net/

这似乎不转换报价?即

@behelit是的,刚刚检查过。但是,是安全字符。但是"引发异常!与java.net.URL相同。

如果您不喜欢图书馆,该怎么办?

请注意,您不应在整个网址上使用此功能,而应在组件上使用此功能...例如在构建URL时,仅使用" a b"组件-否则计算机将不知道哪些字符应具有特殊含义,哪些字符应具有文字含义。

/** 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;

}

这是行不通的(至少在某些情况下)。例如。性格?编码为%M1,但应编码为%C5%A0。

这对于诸如Tab之类的字符也不起作用。我建议将其更改为不匹配[A-Za-z0-9 _-。?]时不安全。参见en.wikipedia.org/wiki/Percent-encoding

我的一个项目从字符串创建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);

不处理转换问号(我尝试使用URL:http:www.google.comDo you like Spam?并处理了空格,但末尾没有问号)

@kentcdodds是因为在这种情况下问号是合法的。我确定如果以后再添加一个,它将被转换

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

The multi-argument constructors quote illegal characters as required by the components in which they appear. The percent character ('%') is always quoted by these constructors. Any other characters are preserved.

所以如果你用

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

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

如果您知道您的字符串中没有URL片段(例如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);

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

好吧,我尝试使用

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

我希望这是您真正想要的?

谢啦。可行!

这是我一直在寻找的答案,不需要依赖外部库。

不,这是错误的答案。 URLDecoder.decode("to convert","UTF-8")返回"要转换",URLDecoder.decode("to%20convert","UTF-8")返回"要转换"。因此,这与问题的提出恰恰相反。

或者,您可以使用此类:

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

自API级别1起就存在于Android中。

但是,令人讨厌的是,它特别对待空格(用+代替%20代替空格)。为了解决这个问题,我们只需使用以下片段:

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

这将使google.com?q=a+b不能按需提供google.com?q=a%20b。

嗯,是的,几周后发现自己。将修改答案以反映我们最终使用的内容

现在已淘汰此方法,用户应指定一种编码方法,请参见:docs.oracle.com/javase/1.4.2/docs/api/java/net/URLEncoder.html

是的,我很想念。答案已修正。

前几天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/

我最终使用了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值