对URL字符串进行编码的最佳方法是什么,使它们符合rfc2396并解码符合rfc2396的字符串,例如将%20替换为空格字符?
编辑: URLEncoder和URLDecoder类执行不编码/解码符合rfc2396的URL,它们编码为MIME类型application / x-www-form-urlencoded,用于编码HTML表单参数数据。
答案 0 :(得分:12)
使用URI类,如下所示:
URI uri = new URI("http", "//www.someurl.com/has spaces in url", null);
URL url = uri.toURL();
或者如果你想要一个字符串:
String urlString = uri.toASCIIString();
答案 1 :(得分:2)
您的组件部分(可能包含必须转义的字符)应该在连接到URI之前使用URLEncoder进行转义。
如果你有一个带有带外字符的URI(如空格,“<> [] {} \ | ^`和非ASCII字节),那它实际上不是一个URI。你可以试试通过手动%-escaping修复它们,但这是一个最后的修复操作,而不是标准的编码形式。当你从用户输入接受可能格式错误的URI时,这通常是必要的,但它不是标准化的操作,我不知道任何内置的Java库函数会为你做这件事;你可能不得不用RegExp自己解决一些问题。
在另一个方向上,您必须将URI拆分为其组成部分(每个单独的路径部分,查询参数名称和值等),然后才能覆盖每个部分(使用URLDecoder)。没有明智的方法可以一次性对整个URI进行编码;您可以尝试“解码不解码为分隔符的%-escapes”(例如/?=&amp ;;%)但是您将留下一个不符合任何URI处理标准的奇怪的不一致字符串。
URLEncoder / URLDecoder适用于处理URI查询组件,包括名称和值。但是,它们完全正确处理URI路径部分组件。区别在于'+'字符并不意味着路径部分中的空格。您可以使用简单的字符串替换来解决此问题:在URLEncoding之后,将'+'替换为'%20';在URLDecoding之前,将'+'替换为'%2B'。如果您不打算在路径中包含包含空格或加号的段,则可以忽略差异。
答案 2 :(得分:1)
javadocs建议使用java.net.URI类来完成编码。 要确保URI类正确编码url,必须使用其中一个多参数构造函数。这些构造函数将执行所需的编码,但要求您将任何url字符串解析为参数。
如果要解码,则必须使用单个参数构造函数构造URI,该构造函数不执行任何编码。然后,您可以调用getPath()等方法来检索和构建解码后的URL。
答案 3 :(得分:-3)