lev*_*lex 5 ruby uri idn ruby-2.0 addressable-gem
在我的Ruby应用程序中,我需要处理来自用户输入的URI(实际上是IRI)
str = "http://??????.???????/?????_?????"
Run Code Online (Sandbox Code Playgroud)
我使用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
Run Code Online (Sandbox Code Playgroud)
这很好用,但显然不适合显示给最终用户.
为此,我想将此URI转换回其原始形式(非punycode,非百分比编码路径)
可寻址有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
Run Code Online (Sandbox Code Playgroud)
这看起来很有效:
display_s = Addressable::URI.parse(str).display_uri.to_s
pretty = Addressable::URI.unencode(display_s.force_encoding("ASCII-8BIT"))
Run Code Online (Sandbox Code Playgroud)
但是,该代码看起来不对(我不应该使用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"
Run Code Online (Sandbox Code Playgroud)
对此:
"http://??????.???????/?????_?????"
Run Code Online (Sandbox Code Playgroud)
您不需要任何强制(重新)编码来恢复原始 URI。简单地:
\n\nnormalised_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" \nAddressable::URI.unencode(Addressable::URI.parse(normalised_s).display_uri)\n\n=> "http://\xe0\xa4\x89\xe0\xa4\xa6\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xb0\xe0\xa4\xa3.\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe/\xe0\xa4\xae\xe0\xa5\x81\xe0\xa4\x96\xe0\xa5\x8d\xe0\xa4\xaf_\xe0\xa4\xaa\xe0\xa5\x83\xe0\xa4\xb7\xe0\xa5\x8d\xe0\xa4\xa0"\nRun Code Online (Sandbox Code Playgroud)\n\n重复鲍勃在评论中所说的话,规范化绝对是保证存储唯一性的好方法。
\n