0

是否有(正确)编码包含 unicode 字符的 URL 的 Android 类?例如:

Blue Öyster Cult

使用 java.net.URI 转换为以下内容:

uri.toString()
 (java.lang.String) Blue%20Öyster%20Cult

Ö 字符未编码。使用URLEncoder

URLEncoder.encode("Blue Öyster Cult", "UTF-8").toString()
 (java.lang.String) Blue+%C3%96yster+Cult

它编码太多(即空格变成“+”,路径分隔符“/”变成%2F)。如果我使用 Dolphin 网络浏览器单击包含 unicode 字符的链接,它可以正常工作,所以显然可以做到这一点。但是,如果我尝试使用上述任何字符串打开 HttpURLConnection,则会出现HTTP 404 Not Found异常。

4

2 回答 2

2

我最终拼凑出一个似乎适用于此的解决方案,但可能不是最强大的:

url = new URL(userSuppliedPath);
String context = url.getProtocol();
String hostname = url.getHost();
String thePath = url.getPath();
int port = url.getPort();
thePath = thePath.replaceAll("(^/|/$)", ""); // removes beginning/end slash
String encodedPath = URLEncoder.encode(thePath, "UTF-8"); // encodes unicode characters
encodedPath = encodedPath.replace("+", "%20"); // change + to %20 (space)
encodedPath = encodedPath.replace("%2F", "/"); // change %2F back to slash
urlString = context + "://" + hostname + ":" + port + "/" + encodedPath;
于 2013-03-23T00:22:41.923 回答
1

URLEncoder 旨在用于编码表单内容,而不是整个 URI。将 / 编码为 %2F 是为了防止用户输入被解释为目录,而 + 是表单数据的有效编码。(表单数据 == URI 后面的一部分?)

理想情况下,您应在将“Blue Öyster Cult”附加到基本 URI之前对其进行编码,而不是对整个字符串进行编码。如果“Blue Öyster Cult”是路径的一部分而不是查询字符串的一部分,您必须自己将 + 替换为 %20。有了这些限制,URLEncoder 可以正常工作。

于 2013-03-19T22:48:25.560 回答