【问题标题】:Can I replace % 20 with & nbsp in URLs that have spaces?我可以在有空格的 URL 中用 & nbsp 替换 % 20 吗?
【发布时间】:2009-07-07 17:45:03
【问题描述】:

在我的 HTML 中,我可以使用字符实体引用“ ”代替 Web URL 中的“%20”吗?

它们都是空格,对吧?

【问题讨论】:

  • 一开始你有什么可能的理由想要这样做?我有一种不想知道的感觉……
  • 你到底想做什么?
  • @Pup:这里的问题是 URL 和 HTML 是两个完全独立的东西,它们符合不同的规则。您不能仅仅因为它们被结合使用,就假设一个系统的规则自动适用于另一个系统。
  • @Tomalak:实际上,HTML 字符实体引用 do 在 HTML 中出现的 URL 中起作用。我注意到很多人对此感到困惑。浏览器会将所有字符实体引用转换为它们在属性中引用的字符,包括 URI 属性,如 href 和 src。事实上,当你在 HTML 中写“example.com/?foo=bar&baz=quux”时,它在技术上是无效的,因为你实际上应该写 &,而不是 &。多年来我遇到的认为“&”的人数在一个 URL 内的 HTML 文档中会发送 5 个字符到服务器是惊人的。
  • @Pup:下载的文件名最好保存在“Content-Disposition”HTTP头的“filename”参数中。

标签: html url encoding character-encoding


【解决方案1】:

简短的回答是,它们都用于表示“空格”,但它们表示不同个空格。

%20 是为字节 32 转义的 URL,它对应于您可能在 URL 中使用的几乎任何编码中的普通旧空间。

  是一个 HTML 字符引用,实际上是指 Unicode 的字符 160(以及 ISO-8859-1 aka Latin-1)。它完全是一个不同的空格字符——“不间断空格”。尽管它们看起来几乎相同,但它们是不同的字符,您的服务器不太可能以相同的方式对待它们。

【讨论】:

  • 抛开这两种类型的空间表示之间的差异不谈,您知道是否允许在 URL 中使用 html 字符实体引用,无论是根据规范还是在实际实现中?
  • @Matt 是也不是。在 HTML 文档中 的 URL 中允许 HTML 字符实体引用。事实上,HTML 文档中 URL 中的 & 符号应该是 HTML 转义的。在 HTML 中包含“http://example.com/foo?bar=1&baz=2”实际上是无效的。它应该是“http://example.com/foo?bar=1&baz=2”。也就是说,HTML 实体引用并不是真正的“在 URL 中”。它在该 URL 的 HTML 表示中。 URL 本身只有 &,其中 HTML 包含 &
  • @Matt 差点忘了:我相信古代版本的 MSIE 会尝试在表单提交中使用 HTML 字符实体引用来处理无法在用于表单提交的字符集中表示的字符。这根本不符合标准,这对 MSIE 来说并不奇怪。
  • 真的很有趣。我认为这一点特别好:'也就是说,HTML 实体引用并不是真正的“在 URL 中”。它在那个 URL 的 HTML 表示中。鉴于您在此处的 cmets 中所说的内容,您可能需要更新您的答案以区分浏览器地址栏中 URL 的使用与 HTML 文档中的使用。 OP 的问题没有区别,但考虑到您的 cmets,这是一个关键的区别。
【解决方案2】:

没有。空格(技术上)也不是。不过,这两个 表示 空间的方式不同。尽一切努力在您的 URL 中没有空格或空格代表。许多人发现用 _ 或 - 替换空格更优雅(包括我)

【讨论】:

  • 根据您的观点,这并不完全正确。 %20 代表一个空格,但  代表一个 non-break 空格,从技术上讲是一个单独的字符。因此,即使在 URL 中使用 HTML 转义是个好主意,这也行不通,因为它会将一个字符替换为另一个字符,从而改变 URL 的含义。
  • 这与我的回答有何不同?
  • 不只是用不同的方式表示空间,而是表示不同的空间。
  • 是的。我对此很清楚。但它们仍然代表空间——这就是我所说的。
【解决方案3】:

没有。  是一个 HTML 不间断空格实体;该实体在文件系统或 URL 可能指向的任何其他地方使用时没有任何意义。 URL 不是用 HTML 编码的。

【讨论】:

  • 您可以在文件名中包含不间断的空格,至少在某些文件系统中是这样。这可能不是一个好主意,但是说“这个实体在文件系统中使用时没有意义”有点过分了。这只是另一个角色。 (如果你指的是实体引用, ,他说的是在 HTML 中使用它,所以浏览器会负责将实体引用转换为相应的字符。)
【解决方案4】:

不,不在 URL 中。您可以做的是替换 URL 文本表示中的空格。

所以而不是:

<a href="http://some.site/doc%20with%20spaces">http://some.site/doc%20with%20spaces</a>

你可以拥有:

<a href="http://some.site/doc%20with%20spaces">http://some.site/doc&nbsp;with&nbsp;spaces</a>

【讨论】:

  • 有谁知道为什么我在下方示例中的&amp;amp;nbsp; 没有出现?它曾经,我敢肯定......
  • 因为变成了空格!使用 &nbsp;让它正确显示。
  • 快!你真的认为这是原因吗? ;-) 说真的——我认为“代码”部分是逐字显示它的内容。我认为它直到最近才这样做。现在如果我写&amp;amp;nbsp;,我担心这会在某个时候出现......
【解决方案5】:

%20 是您通过 URL 编码获得的,因此如果您要在 URL 中使用它,您应该使用它。

 是一个 HTML 实体,应该用于 HTML 文档中的“不间断空格”。

【讨论】:

    【解决方案6】:

    大多数人都尽量避免在 URL 中的文件名中使用空格。他们每次都会给你带来严重的头痛,所以试着这样做。

    如果您想在 URL 中包含空格,您必须使用 %20 对其进行编码。

    &nbsp 被浏览器用来知道如何显示页面。此信息仅用于显示。 %20 将被发送到服务器,该服务器管理将网页传输给访问者所需的所有内容。服务器不会说 html,因此服务器会将 &nbsp 解释为文件名的正常部分并搜索以 foo bar 方式调用的文件。将找不到此文件。更糟糕的是,Web 服务器会认为 & 开始于 url 的变量部分,只搜索页面 foo,然后尝试生成变量 nbsp 和变量 bar,但他想查看它们的任何值。总而言之,Web 服务器无法处理其中包含 的 URL。

    【讨论】:

    • 服务器不会说 HTML,但他说的是在他的 HTML 中使用这个。浏览器确实解释属性中的字符引用,包括 URL,因此  将变成一个不间断的空间。服务器永远不会看到 &(或“nbsp;”)。
    • 好的,这样服务器就会看到一个正常的空白。这也是一件坏事:)
    • 不,它会看到一个不间断的空格字符。这是与普通空间不同的字符。
    【解决方案7】:

    也不是空格。你不应该使用空格,但如果出于某种原因你无法避免它,你应该能够做到......

    <a href="Web Page.aspx">Hey there</a>
    

    ...点击它会自动将用户导航到

    WebSite/Web%20Page.aspx
    

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多