在我的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有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
简而言之
我如何将以下内容转换:
"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://उदाहरण.परीक्षा/मुख्य_पृष्ठ"