Java URLEncoder改变特殊字符?

Posted

技术标签:

【中文标题】Java URLEncoder改变特殊字符?【英文标题】:Java URLEncoder changing special character? 【发布时间】:2011-01-18 03:12:31 【问题描述】:

我想使用 java 的 URLEncoder class 来编码我的 url 字符串。但是,默认情况下,它将空格转换为“+”(加号)。我希望它使用 '-' 代替(类似于本网站对其 url 的编码方式)。

我想知道最好的方法是什么?我应该只使用它的内置功能然后进行字符串替换(从“+”到“-”)吗?谢谢

【问题讨论】:

【参考方案1】:

本网站没有用连字符“编码其 URL”,它首先以这种方式定义它们,显然不需要编码。这取决于他们如何生成 URL。你也可以这样做,但这不是 URLEncoding,它只是生成 URL。将 URLEncoder 用于此任务,它不是为它设计的,并抱怨它完全按照它应该做的而不是你想要的,这是毫无意义的。正如 BalusC 所说,URLEncoder 是您的浏览器和世界各地的 Web 服务器之间的合同的一部分。你无法改变它。

【讨论】:

【参考方案2】:

同意@BalusC。

我还想指出,您尝试做的并不是“URL 编码”这个短语的正常意义上的“编码”。编码意味着有一个反向解码步骤可以返回原始 URL。除非您有一些排除“-”字符的业务规则(例如,如果您从“文本”创建 URL 名称,则使用连字符),您的转换将不可逆。

您似乎正在根据某些可能不可逆的规则将 URL 字符串转换为其他 URL 字符串。 URLEncoder 类(它实现了一种特定的标准化可逆编码)没有实现您的(特定于应用程序的)转换,这并不奇怪。

正如@BalusC 指出的那样,正确的方法是在编码之前 转换 URL 字符串(根据您的应用程序的需要)。实际上,在组装完整的 URL 之前,对 URL 字符串的组件进行转换可能会更好(例如更安全)。

(我理所当然地认为这些 URL 是在实际需要 URLEncoder 实现的编码的上下文中使用的。)

【讨论】:

【参考方案3】:

URLEncoder 根据specific contract 对 URL 进行编码。您可以而且应该更改它。确实只是事后做一个字符串替换,或者更好,beforehand。连字符- 即已经是URL 中的有效字符。

String encodedURL = URLEncoder.encode(url.replace(" ", "-"), "UTF-8");

【讨论】:

以上是关于Java URLEncoder改变特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

http请求特殊字符转码

java里如何将字符转为url码?

Android:URLEncoder空格被转码为“+”号

Android:URLEncoder空格被转码为“+”号

Android:URLEncoder空格被转码为“+”号

java用正则表达式判定特殊字符是不是,存在就替换的问题?