在文件名内的 URL 中使用字符 #

问题描述 投票:0回答:2

我需要添加一个链接

href="file://attachments/aaaa_#_aaaa.msg"
显然这种方式是行不通的,因为哈希字符
#
用于锚点。

所以我尝试将其更改为:

href="file://attachments/aaaa_%23_aaaa.msg"
但是当我在 IE 中打开 url 时,浏览器试图打开这个:
href="file://attachments/aaaa_%2523_aaaa.msg"
IE 正在将
%
字符编码为
%25

如何将文件名放在URL中进行编码并在所有浏览器中读取哈希字符

#
来下载文件?

我无法更改文件名来删除这个字符,所以我需要一种方法来处理这个问题。

html internet-explorer url file-uri percent-encoding
2个回答
2
投票

如果您能够重命名文件,使其不包含“#”字符,您将避免很多很多很多痛苦。只要它们这样做,您就可能会遇到当前和未来的跨浏览器问题,让未来开发人员在您的代码上工作时感到困惑(或者当您忘记编码的来龙去脉时,您将来会感到困惑) )等。此外,某些 Unix/Linux 系统不允许在文件名中使用“#”。不确定您正在使用什么操作系统,但您的文件名应该尽可能跨操作系统移植,即使您现在“确定”您永远不会在其中一个系统上运行。


0
投票

问题在于,在 URL 中,# 引入片段,而 ?引入查询。幸运的是,Unix / Linux / MacOS / iOS 上的路径组件不能包含“/”字符(它们用“/”分隔,但不能包含斜杠),因为这将是另一个痛苦。

文件路径中的几乎所有字符要么原封不动地成为 URL 的一部分,要么进行百分比编码,并且 URL 知道,例如百分比编码的 URL 中的 %20 实际上是路径中的空格字符。

两个例外是 # 和 ?。一旦你有一个包含 # 或 ? 的路径(这是完全合法的),解析 URL 就会认为是“?”引入一个查询,“#”引入一个片段,所以 ?或#及其后面的所有字符不是路径的一部分,而是变成“查询”和“片段”。而且您无法在原始路径中转义它们,因为 %23 又是一个完全合法的三个字符(百分比、两个和三个字符)的路径,并且百分比转义为 %2523,并且当您或操作系统尝试重新创建路径时,这被翻译为 %23。

(“?”可能会在 shell 脚本编写中造成麻烦,但在路径内部它与任何其他字符一样合法,至少在 MacOS X 和 iOS 中。即使是空字节在路径中也是合法的,除非 C 代码试图将路径处理为 C 字符串会再次遇到麻烦)。

© www.soinside.com 2019 - 2024. All rights reserved.