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

2022-08-31 14:54:17

我有一个字符串表示包含空格的URL,并希望将其转换为URI对象。如果我只是尝试通过以下方式创建它

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

它给了我

java.net.URISyntaxException: Illegal character in path at index X

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

如何解析为对象?myStringURI


答案 1

实际上,您应该对“无效”字符进行 URI 编码。由于该字符串实际上包含完整的 URL,因此很难对其进行正确的 URI 编码。您不知道哪些斜杠应该考虑在内,哪些不应该被考虑。您无法事先在原始数据上预测这一点。这个问题确实需要在更高的层面上解决。这是从哪里来的?它是硬编码的吗?然后自己相应地改变它。它是否作为用户输入进入?验证它并显示错误,让用户自己解决。/StringString

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

URI uri = new URI(string.replace(" ", "%20"));

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

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

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


答案 2
java.net.URLEncoder.encode(finalPartOfString, "utf-8");

这将对字符串进行 URL 编码

finalPartOfString是最后一个斜杠之后的部分 - 在你的情况下,歌曲的名称,看起来。