有些场所/库似乎将URL路径段中的“ @”字符视为应进行编码的“特殊字符”,而某些地方/库则不这样做。
我正在寻找正确的版本。 示例字符串:“ someone@example.com”。
如果我使用的是org.springframework.web.util.UriUtils,则会得到以下结果:
String s1 = UriUtils.encodePathSegment("someone@example.com", "UTF-8");
String s2 = UriUtils.encodeQueryParam("someone@example.com", "UTF-8");
String s3 = UriUtils.encodePath("someone@example.com", "UTF-8");
System.out.println("----------s1: " + s1);
System.out.println("----------s2: " + s2);
System.out.println("----------s3: " + s3);
...输出
----------s1: someone@example.com
----------s2: someone@example.com
----------s3: someone@example.com
谁是正确的,正确的结果是什么,应该将“ @”转换为“%40”吗?
答案 0 :(得分:1)
有些场所/库似乎将URL路径段中的“ @”字符视为应进行编码的“特殊字符”,而某些地方/库则不这样做。
在路径段中必须转义字符的标准是RFC 3986, Appendix A。
path = path-abempty ; begins with "/" or is empty
/ path-absolute ; begins with "/" but not "//"
/ path-noscheme ; begins with a non-colon segment
/ path-rootless ; begins with a segment
/ path-empty ; zero characters
path-abempty = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-noscheme = segment-nz-nc *( "/" segment )
path-rootless = segment-nz *( "/" segment )
path-empty = 0<pchar>
请注意,根据您使用的路径生产方式,可以使用三种不同的细分受众群
segment = *pchar
segment-nz = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
; non-zero-length segment without any colon ":"
但是...
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
因此,@
可以在任何路径段中使用。
需要吗?据我所知,答案是否定的-当@
不充当分隔符时,允许使用pct编码表示。没有明确的内容,但这observation about unreserved characters是一个提示:
当对URI进行取消引用时,对于特定于方案的取消引用过程(如果有)重要的组件和子组件,必须先解析和分离,然后才能安全地解码这些组件中的百分比编码八位位组,否则可能会误认为组件分隔符。唯一的例外是与未保留集中的字符相对应的百分比编码八位位组,可以随时对其进行解码。例如,与波浪号(〜)字符相对应的八位字节通常由较旧的URI处理实现编码为“%7E”;可以将“%7E”替换为“〜”,而无需更改其解释。
这表明允许使用未保留字符的pct编码,即使这显然不是必需的。因此,在解析定界符之后,其他字符也应如此。
仅供参考:未保留的集几乎与您期望的一样。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
答案 1 :(得分:0)
如果您调用class
之类的URL,它将使用您的凭据将您连接到该端点。因此,那时我不会逃避它们。但是,如果它们出现在login(:password)@url.com
之后,我将对其进行转义,因为它们不应用作分隔符。