5

在我的 Ruby 应用程序中,我需要处理来自用户输入的 URI(实际上是 IRI)

str = "http://उदाहरण.परीक्षा/मुख्य_पृष्ठ"

我使用 Addressable 对这些进行规范化,并且只存储规范化的形式:

normalized = Addressable::URI.parse(str).normalize
normalized.to_s
#=> http://xn--p1b6ci4b4b3a.xn--11b5bs3a9aj6g/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0

这很好用,但显然不适合向最终用户展示。

为此,我想将此 URI 转换回其原始形式(非 punycode,非百分比编码路径)

Addressable has display_uri,但只转换主机:

nicer = normalized.display_uri.to_s
#=> http://उदाहरण.परीक्षा/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0

这看起来很有效:

display_s = Addressable::URI.parse(str).display_uri.to_s
pretty = Addressable::URI.unencode(display_s.force_encoding("ASCII-8BIT"))

但是,该代码看起来是错误的(我不需要使用force_encoding),而且我完全不相信它是正确的。

  • 将整个 URI 转换为可供最终用户使用的东西的好方法是什么("http://उदाहरण.परीक्षा/मुख्य_पृष्ठ"

  • 存储标准化的 URI 是一个好主意还是会产生我可能不知道的后果?

代码:https ://gist.github.com/levinalex/6115764

tl;博士

我该如何转换:

"http://xn--p1b6ci4b4b3a.xn--11b5bs3a9aj6g/" +
"%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4" +
"%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0"

对此:

"http://उदाहरण.परीक्षा/मुख्य_पृष्ठ"
4

1 回答 1

0

您不需要任何强制(重新)编码来恢复原始 URI。简单地:

normalised_s = "http://xn--p1b6ci4b4b3a.xn--11b5bs3a9aj6g/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0"        
Addressable::URI.unencode(Addressable::URI.parse(normalised_s).display_uri)

=> "http://उदाहरण.परीक्षा/मुख्य_पृष्ठ"

重复 Bob 在评论中所说的话,规范化绝对是保证存储唯一性的好方法。

于 2014-05-28T00:53:13.980 回答