首页 > 解决方案 > URL 编码查询路径中的字符 @

问题描述

有些地方/库似乎将 URL 路径段中的“@”字符视为应编码的“特殊字符”,而有些地方/库则不考虑。

我正在寻找正确的版本。示例字符串:“someone@example.com”。

...输出

----------s1: someone@example.com
----------s2: someone@example.com
----------s3: someone@example.com

谁是对的,正确的结果应该是什么,“@”是否应该转换为“%40”?

标签: javaresthttpurlencode

解决方案


有些地方/库似乎将 URL 路径段中的“@”字符视为应编码的“特殊字符”,而有些地方/库则不考虑。

在路径段中必须对字符进行转义的标准是RFC 3986,附录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 编码表示。没有什么明确的,但是这个关于未保留字符的观察是一个提示:

取消引用 URI 时,必须解析和分离对特定于方案的取消引用过程(如果有)重要的组件和子组件,然后才能安全地解码这些组件中的百分比编码八位位组,否则数据可能会被误认为组件分隔符。唯一的例外是与未保留集中的字符相对应的百分比编码八位字节,可以随时解码。例如,与波浪号(“~”)字符对应的八位字节通常被旧的 URI 处理实现编码为“%7E”;"%7E" 可以替换为 "~" 而不会改变其解释。

这表明允许对未保留字符进行 pct 编码,即使这显然不是必需的。因此,在解决分隔符后,其他字符也应该如此。

供参考:未保留的集合几乎是您所期望的。

unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"

推荐阅读