目前有final URL url = new URL(urlString);
但我遇到的服务器不支持路径中的非ASCII。
使用Java(Android)我需要对来自
的URL进行编码http://acmeserver.com/download/agc/fcms/儿子去哪儿/儿子去哪儿.png
到
http://acmeserver.com/download/agc/fcms/%E5%84%BF%E5%AD%90%E5%8E%BB%E5%93%AA%E5%84%BF/%E5%84%BF%E5%AD%90%E5%8E%BB%E5%93%AA%E5%84%BF.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值 是非法的:
<A href="http://foo.org/Håkon">...</A>
我们建议用户代理采用以下约定 在这种情况下处理非ASCII字符:
- 将UTF-8中的每个字符(参见[RFC2279])表示为一个或多个 字节。
- 使用URI转义机制(即,通过。)转义这些字节 将每个字节转换为%HH,其中HH是十六进制表示法 字节值)。
醇>
答案 0 :(得分:5)
您应该只对特殊字符进行编码并将它们解析在一起。如果您尝试对整个URI进行编码,那么您就会遇到问题。
坚持:
String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;
在网址编码上查看此great guide。
话虽如此,一点点搜索表明可能还有其他方法可以做你想做的事情:
尝试一下:
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中可用的一些功能 类。首先,URL类可以将URL分解为正确的URL 组件,所以你不需要进行任何字符串搜索/替换 工作。其次,这种方法利用了URI类 通过构造URI时正确转义组件的功能 组件而不是单个字符串。
这种方法的优点是你可以使用任何有效的url字符串 并且让它在不需要任何特殊知识的情况下工作。
答案 1 :(得分:1)
我这样做了,这很麻烦
//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();
答案 2 :(得分:1)
final URL url = new URL( new URI(urlString).toASCIIString() );
为我工作。