如何正确编码URI的特殊字符?

时间:2014-10-02 14:11:06

标签: java http url uri httpurlconnection

我创建了一个URL来获取服务器上的文件。

但是,文件名可能包含特殊字符,如:~!@#$%^&*()或 一些亚洲人物,如日语,中文和韩语。

我已阅读this article并采用解决方案:

String dwnStr= new String("http://") + `HOST_IP_ADDRESS` + new String('/')
                    + "picture/dog.jpg";
URL url= new URL(dwnStr);
URI uri= new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); // According to the official doc, it's in all cases.
url= uri.toURL();
(HttpURLConnection) url.openConnection();

如果dwnStr不包含任何特殊字符,情况会很好。相比之下,如果dwnStr包含#哈希标记,{URL 1}}构造函数会删除#之后的单词,将其作为片段标识符。

因此,我尝试了另一种解决方案(仍然在上面的链接中。这一次,我避免使用URL

uri = new URI("http", null, HOST_IP_ADDRESS, 80, null,URLEncoder.encode("picture/dog.jpg", "UTF-8"), null);

它甚至无法处理不包含任何特殊字符的文件名。

我犯了什么错误?

我还能采用什么策略?

ps:1。我也在this article尝试了所选择的解决方案。当然,它没有用。

  1. 官方文档链接:official doc

1 个答案:

答案 0 :(得分:0)

您需要调用toASCIIString()方法。它返回一个String,您可以将其发送到远程服务器。

另一种选择是使用IDN类的静态方法toASCII