假设我的Web应用程序呈现以下标记:
<object type="application/x-pdf" data="http://example.com/test%2Ctest.pdf">
<param name="showTableOfContents" value="true" />
<param name="hideThumbnails" value="false" />
</object>
data
属性应该转义(百分比编码路径)还是不转义?在我的例子中它是。我没有找到任何规范。
附录
实际上,我对使用data
属性的浏览器插件应该看到什么的规范感兴趣。例如,Adobe Acrobat插件同时包含转义和未转义的uri。但是,QWebPluginFactory将data
属性视为人类可读的URI(未转义),这会导致双倍编码。我想知道它是否是QWebPluginFactory
的错误。
答案 0 :(得分:1)
data
attribute期望该值为URI。因此,您应该提供一个语法上有效的URI值。
URI的当前规范是RFC 3986。要查看URI路径中的,
是否需要编码,请查看路径生成规则的定义方式:
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
由于我们有一个带有权限信息的URI,我们需要看一下 path-abempty (参见URI production rule):
path-abempty = *( "/" segment )
段是零个或多个 pchar 字符,定义如下(我已经扩展了生产规则):
pchar = ALPHA / DIGIT / "-" / "." / "_" / "~" / "%" HEXDIG HEXDIG / "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" / ":" / "@"
正如您所看到的, pchar 扩展为文字,
。因此,您无需对路径组件中的,
进行编码。但是,由于您可以使用百分比编码对任何非分隔字符进行编码而不更改其含义,因此可以使用%2C
代替,
。
答案 1 :(得分:0)
网址通常只能包含特定字符。不幸的是,不同的规范包含被认为是保留的不同字符列表,因此无法使用。
在您的示例中,编码字符是逗号(,
),在某些规范中是保留字符,因此编码它没有错。
大多数网络服务器应该处理未编码和编码的逗号,但是根据它们的配置,可能会有一些不这样做。因此,首先避免在文件名中使用特殊字符(如您的示例中所示)通常是个好主意。
在GET参数中包含特殊字符时,始终需要URL编码。例如,支持将C&A
作为值的GET参数必须写为:
http://example.com/somescript.php?value=C%26A
修改强>
插件(甚至是浏览器)都不关心。他们不会尝试(或需要)解码它或类似的东西。他们只是请求从服务器输入的URL。