Java – 如何编码非拉丁字符的URL路径

目前有final URL url = new URL(urlString); 但我遇到服务器不支持路径中的非ASCII。

使用Java(Android)我需要对来自的URL进行编码

 http://sofzh.miximages.com/java/儿子去哪儿.png 

 http://sofzh.miximages.com/java/儿子去哪儿.png 

就像浏览器一样。

我检查了URLEncoder.encode(s, "UTF-8"); 但它也编码/斜杠

 http%3A%2F%2acmeserver.com%2Fdownload%2Fagc%2Ffcms%2F%E5%84%BF%E5%AD%90%E5%8E%BB%E5%93%AA%E5%84%BF%2F%E5%84%BF%E5%AD%90%E5%8E%BB%E5%93%AA%E5%84%BF.png 

有没有方法可以简单地解析方法得到的字符串?

来自http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars

B.2.1 URI属性值中的非ASCII字符尽管URI不包含非ASCII值(参见[URI],第2.1节),但作者有时会在期望URI的属性值中指定它们(即,使用%URI定义;在DTD中) 。 例如,以下href值是非法的:

...

我们建议用户代理在这种情况下采用以下约定来处理非ASCII字符:

  1. 将UTF-8中的每个字符(参见[RFC2279])表示为一个或多个字节。
  2. 使用URI转义机制转义这些字节(即,通过将每个字节转换为%HH,其中HH是字节值的hex表示法)。

您应该只编码特殊字符并将它们一起解析。 如果你试图编码整个URI,那么你会遇到问题。

坚持:

 String query = URLEncoder.encode("apples oranges", "utf-8"); String url = "http://stackoverflow.com/search?q=" + query; 

查看这个关于URL编码的精彩指南 。

话虽如此,一点点搜索表明可能还有其他方法可以做你想做的事情:

尝试一下:

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

(您需要对这些空间进行编码,以便将其用于请求。)

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

这种方法的优点在于,您可以使用任何有效的url字符串并使其工作,而无需自己了解任何特殊知识。

我这样做了,这很麻烦

  //was: final URL url = new URL(urlString); String asciiString; try { asciiString = new URL(urlString).toURI().toASCIIString(); } catch (URISyntaxException e1) { Log.e(TAG, "Error new URL(urlString).toURI().toASCIIString() " + urlString + " : " + e1); return null; } Log.v(TAG, urlString+" -> "+ asciiString ); final URL url = new URL(asciiString); 

url后来用于

  connection = (HttpURLConnection) url.openConnection(); 
 final URL url = new URL( new URI(urlString).toASCIIString() ); 

为我工作。