无法翻译空间字符的URLEn编码器

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我期待着

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

产出:

Hello%20World

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

然而,我得到的是:

Hello+World

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

提问于
用户回答回答于

这符合预期的行为。大URLEncoder实现HTML规范,说明如何在HTML表单中编码URL。

从javadocs:

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

从HTML规范:

应用程序/x-www-表单-urlencode与此内容类型一起提交的表单必须编码如下:

  1. 控件名称和值被转义。空格字符改为‘+’

你必须更换它,例如:

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

这个类执行application/x-www-form-urlencoded-类型编码,而不是百分比编码,因此用+是正确的行为。

来自javadoc:

在编码字符串时,适用下列规则:

  • 字母数字字符“a”至“z”、“A”至“Z”和“0”至“9”保持不变。
  • 特殊人物“。”,“-”,“*“,和”_“保持原样。
  • 空格字符“”被转换为加号“+”。
  • 所有其他字符都是不安全的,首先使用某种编码方案将其转换为一个或多个字节。然后,每个字节由三个字符的字符串“%XY”表示,其中XY是字节的两位数字十六进制表示形式。建议使用的编码方案是UTF-8。但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。

扫码关注云+社区