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