2013-03-19 65 views
0

是否存在能正确编码包含unicode字符的URL的Android类?例如:对包含Unicode字符的URL进行编码

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异常。

+0

[**后一种方法是正确的**](HTTP:// ideone .com/bAnuL8)'%2F'是一个百分比编码的'/',它不存在于字符串“BlueÖysterCult”中。您正在测试的内容与您应该使用的内容之间存在虚假的断开连接。 – 2013-03-19 22:35:28

+0

@MattBall我不小心粘贴了早期测试(更正后)的%2F。但这也是一个问题。真正的URL是一个完整的HTTP链接,包含我不想编码的斜线。 – 2013-03-19 22:38:46

+0

然后,您需要在构建整个URL字符串之前对组件进行编码。如果你有一个字符串表示一个URL,其中一些部分应该是百分比编码的,而另一些部分则不应该,但已经太晚了。 – 2013-03-19 22:49:50

回答

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; 
1

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

理想情况下,你会编码“蓝牡蛎崇拜” 之前追加到你的基地URI,而不是编码整个字符串。如果“BlueÖysterCult”是路径的一部分而不是查询字符串的一部分,则必须自行将%20替换为%20。有了这些限制,URLEncoder可以正常工作。

+0

这就是我所害怕的。没有办法可以干净地做到这一点。这些链接是从HTML文件中解析出来的,也可以是用户提供的。我使用URL.getPath()来获取路径部分,但需要对其进行编码。 – 2013-03-19 23:18:45

相关问题