说我有一个网址
http://example.com/query?q=
并且我有一个由用户输入的查询,例如:
随机词£500银行$
我希望结果是正确编码的URL:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
实现此目标的最佳方法是什么?我尝试URLEncoder
创建URI / URL对象,但是没有一个是正确的。
URLEncoder
是要走的路。你只需要记住只对单个查询字符串参数名称和/或值进行编码,而不对整个URL进行编码,请确保对查询字符串参数分隔符&
和参数名称-值分隔符都不进行编码=
。
String q = "random word £500 bank $";
String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);
当你仍不使用Java 10或更高版本时,请StandardCharsets.UTF_8.toString()
用作charset参数,或者当你仍不使用Java 7或更高版本时,请使用"UTF-8"
。
请注意,查询参数中的空格由+
而不是表示%20
,这是合法有效的。在%20
通常被用于表示URI本身(URI查询字符串分隔符之前的部分的空间?
),而不是在查询字符串(之后的部分?
)。
另请注意,有三种encode()
方法。一个不Charset
带有第二个自变量,另一个不带有String
第二个自变量,这将引发已检查的异常。不带Charset
参数的选项已弃用。永远不要使用它,并且总是指定Charset
参数。在javadoc中甚至明确建议使用UTF-8编码,通过的授权RFC3986和W3C。
所有其他字符都是不安全的,并且首先使用某种编码方案将其转换为一个或多个字节。然后,每个字节由3个字符的字符串“%xy”表示,其中xy是该字节的两位十六进制表示形式。推荐使用的编码方案是UTF-8。但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。
URL中可以有两种类型的参数。查询字符串(后跟?)和路径参数(通常是URL本身的一部分)。那么,路径参数呢?URLEncoder会为空间生成+,即使对于路径参数也是如此。实际上,它只处理查询字符串以外的任何内容。另外,此行为与节点js服务器不同步。因此,对我来说,这堂课很浪费,只能用于非常特殊/特殊的情况。
@sharadendusinha:如记录和回答的那样,
URLEncoder
用于URL编码的查询参数符合application/x-www-form-urlencoded
规则。路径参数不属于此类别。您需要一个URI编码器。正如我预料的那样...用户感到困惑,因为显然问题是人们需要编码的不仅仅是参数值。这是非常罕见的情况,您只需要对参数值进行编码。这就是为什么我提供“困惑的” Wiki答案来帮助@sharadendusinha之类的人的原因。
@WijaySharma:因为特定于URL的字符也会被编码。仅当您要将整个URL作为另一个URL的查询参数传递时,才应该这样做。
我需要听到“ +,而不是%20”。非常感谢。