如何对URL进行编码以避免Java中的特殊字符?
2022-09-01 02:54:42
我需要java代码来编码URL以避免特殊字符,如空格和%和&...等
URL 构造很棘手,因为 URL 的不同部分对允许的字符有不同的规则:例如,加号保留在 URL 的查询组件中,因为它表示空格,但在 URL 的路径组件中,加号没有特殊含义,空格编码为“%20”。
RFC 2396 解释(在 2.4.2 节中)完整的 URL 始终采用其编码形式:您获取各个组件(方案、权限、路径等)的字符串,根据其自己的规则对每个组件进行编码,然后将它们组合成完整的 URL 字符串。尝试构建一个完整的未编码的URL字符串,然后单独对其进行编码会导致细微的错误,例如路径中的空格被错误地更改为加号(符合RFC的服务器将解释为真正的加号,而不是编码的空格)。
在 Java 中,构建 URL 的正确方法是使用 URI
类。使用将 URL 组件作为单独字符串的多参数构造函数之一,它将根据该组件的规则正确转义每个组件。该方法为您提供了一个可以发送到服务器的正确转义和编码的字符串。若要解码 URL,请使用单字符串构造函数构造对象,然后使用访问器方法(如 )检索解码的组件。toASCIIString()
URI
getPath()
不要使用该类!尽管有这个名字,但该类实际上执行HTML表单编码,而不是URL编码。连接未编码的字符串以生成“未编码”的 URL,然后通过 .这样做会导致问题(特别是前面提到的关于路径中的空格和加号的问题)。URLEncoder
URLEncoder
我也花了相当多的时间解决这个问题,所以这是我的解决方案:
String urlString2Decode = "http://www.test.com/äüö/path with blanks/";
String decodedURL = URLDecoder.decode(urlString2Decode, "UTF-8");
URL url = new URL(decodedURL);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String decodedURLAsString = uri.toASCIIString();