URL编码器无法翻译空格字符

2022-08-31 05:52:57

我期待

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

输出:

Hello%20World

(20 是空间的 ASCII 十六进制代码)

但是,我得到的是:

Hello+World

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


答案 1

这按预期方式运行。实现了有关如何在 HTML 表单中对 URL 进行编码的 HTML 规范。URLEncoder

来自 javadocs

此类包含用于将字符串转换为应用程序/x-www-form-urlencoded MIME 格式的静态方法。

和从 HTML 规范

application/x-www-form-urlencoded

使用此内容类型提交的表单必须按如下方式进行编码:

  1. 控件名称和值已转义。空格字符将替换为“+”

您必须替换它,例如:

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

答案 2

空格在 URL 中编码,并在表单中编码为提交数据(内容类型 application/x-www-form-urlencoded)。你需要前者。%20+

使用番石榴

dependencies {
     compile 'com.google.guava:guava:23.0'
     // or, for Android:
     compile 'com.google.guava:guava:23.0-android'
}

您可以使用 UrlEscapers

String encodedString = UrlEscapers.urlFragmentEscaper().escape(inputString);

不要使用 String.replace,这只会对空间进行编码。请改用库。