Java 编码和解码rfc2396 URL

Java 编码和解码rfc2396 URL,java,rfc2396,Java,Rfc2396,对URL字符串进行编码以使其符合rfc2396以及对符合rfc2396的字符串进行解码以使例如%20替换为空格字符的最佳方法是什么 编辑: URLEncoder和URLDecoder类不编码/解码rfc2396兼容的URL,它们编码到MIME类型的应用程序/x-www-form-urlencoded,用于编码HTML表单参数数据。使用和。javadocs建议使用java.net.URI类来完成编码。 为了确保URI类正确编码url,必须使用一个多参数构造函数。这些构造函数将执行所需的编码,但要求

对URL字符串进行编码以使其符合rfc2396以及对符合rfc2396的字符串进行解码以使例如%20替换为空格字符的最佳方法是什么

编辑:
URLEncoder和URLDecoder类不编码/解码rfc2396兼容的URL,它们编码到MIME类型的应用程序/x-www-form-urlencoded,用于编码HTML表单参数数据。

使用和。

javadocs建议使用java.net.URI类来完成编码。 为了确保URI类正确编码url,必须使用一个多参数构造函数。这些构造函数将执行所需的编码,但要求您将任何url字符串解析为参数


如果要解码,必须使用单参数构造函数构造URI,该构造函数不进行任何编码。然后,您可以调用getPath()等方法来检索和构建解码后的URL。

您的组件(可能包含必须转义的字符)在连接到URI之前,应该已经使用URLEncoder转义了

如果URI中有带外字符(如空格“[]{}\|^”和非ASCII字节),它不是一个真正的URI。您可以尝试通过手动转义来修复它们,但这是一个最后的修复操作,不是一种标准的编码形式。当您从用户输入中接受可能格式错误的URI时,这通常是必要的,但这不是一个标准化操作,而且我不知道有任何内置Java库函数t将为您做这件事;您可能需要自己用一个RegExp来修改一些东西

在另一个方向上,您必须将URI分解为其组件部分(每个单独的路径部分、查询参数名称和值等),然后才能(使用URLDecker)取消对每个部分的扫描。没有明智的方法一次性对整个URI进行%解码;您可以尝试“解码”-不解码为分隔符的转义(如/?=&;%)但您将得到一个奇怪的不一致字符串,该字符串不符合任何URI处理标准


URLEncoder/URLDecoder可以很好地处理URI查询组件,包括名称和值。但是它们不太适合处理URI路径部分组件。区别在于“+”字符并不表示路径部分中的空格。您可以用简单的字符串替换来解决这一问题:在URLEncoding之后,将“+”替换为“%20”;b在URL解码之前,将“+”替换为“%2B”。如果不打算在路径中包含包含空格或加号的段,则可以忽略此差异。

使用URI类,如下所示:

URI uri = new URI("http", "//www.someurl.com/has spaces in url", null);
URL url = uri.toURL();
或者,如果需要字符串:

String urlString = uri.toASCIIString();

这是行不通的。URLEncoder和URLDecoder用于编码和解码html表单数据,尽管它们的名称不同。application/x-www-form-urlencoded不是一回事吗?不,不是。RFC2396编码与html表单数据的编码不同。请看,答案很少。相关的多参数构造函数没有帮助,因为无法告诉他们查询字符串的哪一部分需要编码,哪一部分不需要编码。我们需要一个接受参数值并返回URL编码形式的方法。根据可能包含的内容,所有查询字符串都可能需要编码。听起来很危险。使用专为RFC2396设计的编码器比尝试破解更安全你可能会犯错误。