我想从一个java.net.URI
对象中获取一个对象String
.该字符串有一些字符需要用它们的百分比转义序列替换.但是当我使用URLEncoder对UTF-8编码的字符串进行编码时,即使/被替换为它们的转义序列.
如何从String对象获取有效的编码URL?
http://www.google.com?q=a b给出 http%3A%2F%2www.google.com ...而我希望输出为 http://www.google.com?q=a% 20B
有人可以告诉我如何实现这一目标.
我试图在Android应用程序中执行此操作.所以我可以访问有限数量的库.
您可以尝试:org.apache.commons.httpclient.util.URIUtil.encodeQuery
在Apache commons-httpclient项目中
像这样(参见URIUtil):
URIUtil.encodeQuery("http://www.google.com?q=a b")
会变成:
http://www.google.com?q=a%20b
你当然可以自己做,但URI解析会变得相当混乱......
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"));
我将在这里针对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"
这是一个格式良好的URL.
如果你不喜欢图书馆,那怎么样?
请注意,您不应该在整个URL上使用此函数,而应该在组件上使用它...例如,只需"ab"组件,因为您构建了URL - 否则计算机将不知道应该使用哪些字符具有特殊意义,哪些具有字面意义.
/** 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; }