目前有final URL url = new URL(urlString);
但我遇到服务器不支持路径中的非 ASCII 的情况。
使用 Java (Android) 我需要对 URL 进行编码
http://acmeserver.com/download/agc/fcms/儿子去哪儿/儿子去哪儿.png
to
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");
但它也编码/
slashes
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
有没有办法简单地做到这一点而不解析该方法获取的字符串?
from http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars
B.2.1 URI 属性值中的非 ASCII 字符
不包含非 ASCII 值(参见 [URI],第 2.1 节)
有时在需要 URI 的属性值中指定它们(即
用 %URI 定义;在 DTD 中)。例如,以下 href 值
是非法的:
<A href="http://foo.org/Håkon">...</A>
我们建议用户代理采用以下约定
在这种情况下处理非 ASCII 字符:
- 将 UTF-8 中的每个字符(参见 [RFC2279])表示为一个或多个
字节。
- 使用 URI 转义机制转义这些字节(即,通过
将每个字节转换为 %HH,其中 HH 是十六进制表示法
字节值)。
您应该只对特殊字符进行编码并将它们一起解析。如果您尝试对整个 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 中可用的几个功能
类。首先,URL 类可以将 url 分解为其正确的部分
组件,因此您无需进行任何字符串搜索/替换
工作。其次,这种方法利用了 URI 类
当您通过以下方式构建 URI 时,正确转义组件的功能
组件而不是单个字符串。
这种方法的优点在于您可以采用任何有效的 url 字符串
并让它工作,而无需您自己具备任何特殊知识。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)