URL编码(时区)(Ruby)

时间:2013-08-20 21:25:39

标签: ruby-on-rails ruby url

我正在尝试使用time_zone发布网址,但我遇到了以下问题

在我的方法中,我有:

base_url = "..."
time_zone = "Alaska" # works
#time_zone = "Pacific Time (US & Canada)" # doesn't work
#time_zone = "Pacific%20Time%20(US%20%26%20Canada)" # doesn't work either 
#time_zone = "Pacific Time" # doesn't work
@url = "#{base_url}?time_zone=#{time_zone}"
@url = URI.encode(@url)
... # connect here

time_zones的可用选择在http://developer.pagerduty.com/documentation/rest/types#timezone

如果我提供例如“阿拉斯加”我获得数据但我需要“太平洋时间(美国和加拿大)”并且它不起作用。

我尝试使用http://meyerweb.com/eric/tools/dencoder/对我的网址进行编码,但它也不起作用。

还有什么我不注意的?

编辑:“太平洋时间”不起作用

2 个答案:

答案 0 :(得分:0)

应该是:

time_zone = "Pacific%20Time"

修改:

  

问题在于使用

URI.encode(url)

你想要的是URI.encode_www_form:

require 'uri'

url = "http://www.example.com/time_zone=Pacific Time (US & Canada)&count=10"
p URI.encode url

query_string = URI.encode_www_form(
  [
    ["time_zone", "Pacific Time (US & Canada)"],
    ["count", 10]
  ]
)
p query_string

--output:--
"http://www.example.com/time_zone=Pacific%20Time%20(US%20&%20Canada)"
"time_zone=Pacific+Time+%28US+%26+Canada%29&count=10"

“US& Canada”部分中的&符号显然需要进行转义,但URI.encode无法做到这一点。我真的很惊讶任何人都会选择一个带有&符号的时区名称。你确定“太平洋时间”本身不会起作用吗?例如,

"http://www.example.com/time_zone=Pacific%20Time"

"http://www.example.com/time_zone=Pacific+Time"

请注意,URI.encode_www_form实现了www.w3.org规范:

http://www.w3.org/TR/html5/forms.html#url-encoded-form-data

警告:

  

这种表单数据集编码在很多方面都是异常的怪异,   多年实施事故和妥协的结果   导致互操作性所需的一系列要求,但是   绝不代表良好的设计实践。特别是读者   提醒要密切注意涉及的扭曲细节   重复(在某些情况下嵌套)字符之间的转换   编码和字节序列。

答案 1 :(得分:0)

问题在于使用

"URI.encode(url)"

这有效:

base_url = "..."
time_zone = "Pacific%20Time%20(US%20%26%20Canada)" 
@url = "#{base_url}?time_zone=#{time_zone}"
# @url = URI.encode(@url) # this made it not work!
 ... # connect here