我在期待

System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));

输出:

你好%20世界

(20是ASCII十六进制空格码)

然而,我得到的是:

你好+世界

我用错方法了吗?我应该使用的正确方法是什么?


当前回答

如果你想编码URI路径组件,你也可以使用标准的JDK函数,例如:

public static String encodeURLPathComponent(String path) {
    try {
        return new URI(null, null, path, null).toASCIIString();
    } catch (URISyntaxException e) {
        // do some error handling
    }
    return "";
}

URI类还可以用于编码URI的不同部分或整个URI。

其他回答

我用错方法了吗?我应该使用的正确方法是什么?

是的,这个方法java.net.URLEncoder.encode并不是根据规范将“”转换为“20%”。

空格字符“”被转换为加号“+”。

即使这不是正确的方法,您也可以将其修改为:System.out.println(java.net.URLEncoder.encode(“Hello World”,“UTF-8”)。replaceAll("\\+", "%20"));祝你今天愉快=)。

查看uri类。

虽然很老了,但还是迅速回应:

Spring提供了UriUtils -使用它你可以指定如何编码以及它与URI的哪个部分相关。

encodePathSegment
encodePort
encodeFragment
encodeUriVariables
....

我使用它们是因为我们已经在使用Spring,即不需要额外的库!

其他答案要么提供手动字符串替换,实际上编码HTML格式的URLEncoder, Apache放弃的URIUtil,或者使用Guava的UrlEscapers。最后一个很好,除了它没有提供解码器。

Apache Commons Lang提供了URLCodec,它根据URL格式rfc3986进行编码和解码。

String encoded = new URLCodec().encode(str);
String decoded = new URLCodec().decode(str);

如果您已经在使用Spring,您也可以选择使用它的UriUtils类。

这是预期的行为。URLEncoder实现了如何在HTML表单中编码url的HTML规范。

来自javadocs:

该类包含的静态方法 将String转换为 应用程序/ x-www-form-urlencoded MIME 格式。

和来自HTML规范:

应用程序/ x-www-form-urlencoded 使用此内容类型提交的表单 必须编码如下: 控件名称和值被转义。空格字符被替换 通过“+”

你必须更换它,例如:

System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("+", "%20"));