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

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

字符串myString=”http://myhost.com/media/File 包含空格的名称。mp3“;
URI myUri=新的URI(myString);

它给了我

java.net.URISyntaxException:索引X处的路径中存在非法字符

其中indexX是URL字符串中第一个空格的位置

如何将myString解析为URI对象

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

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

URI=新的URI(string.replace(“,“%20”);

或者,如果您可以确保它只最后一个斜杠后需要URI编码的部分,那么您也可以借助android.net.URI实用程序类:

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

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

发表评论