【问题标题】:What is nokogiri % encoding $ character什么是 nokogiri % 编码 $ 字符
【发布时间】:2014-07-22 23:46:16
【问题描述】:

我为什么会得到:

Nokogiri::HTML('<a href="/test_$4b.html">test</a>').to_html

=> "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><a href=\"/test_%244b.html\">test</a></body></html>\n"

我认为 $ 符号在 url 中有效?

跟进:

为什么浏览器会以不同的方式处理这个问题。例如。页面内:http://www.pmlive.com/pharma_news/its_on_shire_and_abbvie_agree_32bn_takeover_586969

链接:http://www.pmlive.com/pharma_news/mylan_buys_abbotts_non-us_generics_in_$53 亿_deal_585883 有效。

但 nokogiri 会将此链接解析为: http://www.pmlive.com/pharma_news/mylan_buys_abbotts_non-us_generics_in_%245.3bn_deal_585883 不起作用(返回 404)。

他们是否认为 $ 实际上是安全且更好的选择?

【问题讨论】:

  • 您是否注意到自动链接器是如何解释这两个版本的 URL 的?
  • 是的,我确实注意到了 :-)

标签: ruby nokogiri


【解决方案1】:

this RFC3986 here 将美元符号列为保留的子分隔符(第 12 页)。

保留 = gen-delims / sub-delims

gen-delims = ":" / "/" / "?" /“#”/“[”/“]”/“@”

sub-delims = "!" /“$”/“&”/“'”/“(”/“)”/“*”/“+”/“”/“;” / "="

它还建议如何处理保留字符:

2.2。保留字符

URI 包括由以下分隔的组件和子组件 “保留”集中的字符。这些字符被称为 “保留”,因为它们可能(或可能不)被定义为分隔符 通用语法,由每个特定于方案的语法,或由 URI 的解引用算法的特定于实现的语法。 如果 URI 组件的数据与保留的 字符作为分隔符的目的,那么冲突的数据必须是 在形成 URI 之前进行百分比编码。

Nokogiri 喜欢的作者决定,由于任何人都可以出于任何目的使用他们的库,因此无法自动确定保留字符是否会发生冲突,因此是“最安全”的处理方式(简称直接测试 URI)将按照建议转义它。

【讨论】:

  • 谢谢,很好的答案。您对后续问题有意见吗?
  • @DuncanStewart 尽管它们是保留的,但只要它们符合语法,您仍然可以在 URI 中使用它们。鉴于上下文(文章标题),他们可能决定将其保留,或者他们可能正在使用一个不对标题进行 url 编码的框架。哪个看起来更好:$5.3bn_5_3bn53bn%245%2E3bn
  • 具有讽刺意味的是,在这种情况下始终转义保留字符的决定失败了......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2013-09-16
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多