在我的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 = Addressable::URI.parse("http://example.com/path/to/resource/")
Run Code Online (Sandbox Code Playgroud)
我如何回到" http://example.com/path/to/resource/ " - 我已经查看了uri.methods,但我没有看到我将使用哪一个来获取完整的URI.
addressable/uri 按字母顺序给出params .如果我想在散列中获取查询参数(即nonce,method,rate,order_type,quantity),我该如何更改代码?
2.1.0 :060 > require "addressable/uri"
2.1.0 :061 > uri = Addressable::URI.new
2.1.0 :062 > uri.query_values = Hash["nonce" => 1405069051840, "method" => "a", "rate" => "rate", "order_type" => "order_type", "quantity" => "quantity"]
=> {"nonce"=>1405069051840, "method"=>"a", "rate"=>"rate", "order_type"=>"order_type", "quantity"=>"quantity"}
2.1.0 :063 > params = uri.query
=> "method=a&nonce=1405069051840&order_type=order_type&quantity=quantity&rate=rate"
Run Code Online (Sandbox Code Playgroud)
我需要这样的输出:(因为我通过)
"nonce=1405069051840&method=a&rate=rate&order_type=order_type&quantity=quantity"
Run Code Online (Sandbox Code Playgroud)
现在输出是(字母顺序)
"method=a&nonce=1405069051840&order_type=order_type&quantity=quantity&rate=rate"
Run Code Online (Sandbox Code Playgroud)