在我的 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://उदाहरण.परीक्षा/मुख्य_पृष्ठ"