Android:如何解析带有空格的URL String到URI对象?

whl*_*hlk 61 java url android uri httprequest

我有一个字符串表示包含空格的URL,并希望将其转换为URI对象.如果是简单的尝试

String myString = "http://myhost.com/media/File Name that has spaces inside.mp3";
URI myUri = new URI(myString);
Run Code Online (Sandbox Code Playgroud)

它给了我

java.net.URISyntaxException: Illegal character in path at index X
Run Code Online (Sandbox Code Playgroud)

其中index X是URL字符串中第一个空格的位置.

如何可以解析myString到一个URI对象?

Bal*_*usC 121

实际上,您应该 "无效"字符进行URI编码.由于字符串实际上包含完整的URL,因此很难对其进行正确的URI编码.你不知道/应该考虑哪些斜线,哪些不应该考虑.你不能String事先预测原始的.问题确实需要在更高层次上解决.它String来自哪里?它是硬编码的吗?然后相应地自己更改.它是否以用户输入的形式出现?验证它并显示错误,让用户解决自己.

无论如何,如果你能确保它只是 URL中的空格使它无效,那么你也可以用以下字符串逐个替换%20:

URI uri = new URI(string.replace(" ", "%20"));
Run Code Online (Sandbox Code Playgroud)

或者,如果您可以确保它只是最后一个斜杠之后需要进行URI编码的部分,那么您也可以在android.net.Uri实用程序类的帮助下执行此操作:

int pos = string.lastIndexOf('/') + 1;
URI uri = new URI(string.substring(0, pos) + Uri.encode(string.substring(pos)));
Run Code Online (Sandbox Code Playgroud)

请注意,URLEncoder该任务不可用,因为它旨在根据application/x-www-form-urlencoded规则(在HTML表单中使用)对查询字符串参数名称/值进行编码.另请参阅查询字符串参数的Java URL编码.

  • @Mannaz - 当歌曲名称中出现另一个"无效"符号时要小心. (4认同)

Boz*_*zho 19

java.net.URLEncoder.encode(finalPartOfString, "utf-8");
Run Code Online (Sandbox Code Playgroud)

这将对字符串进行URL编码.

finalPartOfString 是最后一次斜线之后的部分 - 就你的情况而言,就是这首歌的名字.

  • 我使用的是java.net.URLEncoder.encode("aa bb cc","utf-8"); 但不是添加%20而不是空格,而是替换+."AA + BB + CC".为什么会这样. (4认同)
  • 它还会对冒号和斜线进行urlencode,这会使url仍然无效.他基本上只需要对空格进行urlencode以使其有效. (2认同)