ruby-on-rails中的Net :: HTTP.get编码

时间:2014-05-26 22:22:23

标签: ruby-on-rails ruby encoding character-encoding

我正在做一个简单的URL到达,我得到了一些我无法破解的编码。

res_str=Net::HTTP.get(URI.parse("http://suggestqueries.google.com/complete/search?client=youtube&ds=yt&q=s%C3%A1lin"))

我的回答是这样的

  

window.google.ac.h([“s lin”,[[“s linhansj nsm ns”,0],[“s linhans   j nsm nsundir num hrifum“,0],[”s linhansj nsm ns fullkomnar   mig“,0”,[“s lin”,0],[“s linhansj nsm ns d ma”,0],[“s linhans   j nsm nshj r“,0],[”s linhansj nsm nshvarer   draumurinn“,0],[”s linhansj nsm nsoriginal“,0],[”s linhansj ns   m nsefeg tti“,0],[”s linhansj nsm nsokkar   NTT”,0]],{ “Q”: “A9gr8ZE66_XaaFyUIlaNLEwyxQU”, “K”:1}])

然而,如果我在邮递员中测试我的网址,我会得到我想要的结果

  

window.google.ac.h([“sálin”,[[“sálinhansjónsmíns”,0],[“sálin汉斯   jónsmínsundirþínumáhrifum“,0],[”sálinhansjónsmínsþúfullkomnar   mig“,0],[”sálin“,0],[”sálinhansjónsmínsódóma“,0],[”sálin汉斯   jónsmínshjáþér“,0],[”sálinhansjónsmínshvarer   draumurinn“,0],[”sálinhansjónsmínsmininal“,0],[”sálinhansjóns   míns的efégætti“,0],[”sálinhansjónsmínsokkar   诺特”,0]],{ “Q”: “ec​​nVzf6wE6HskDep7UOiRxxu5_4”, “K”:1}])

当我执行我的get in irb:

res_str=Net::HTTP.get(URI.parse("http://suggestqueries.google.com/complete/search?Client=youtube&ds=yt&q=s%C3%A1lin"))

我得到以下内容:

  

“window.google.ac.h([\”s \ xE1lin \“,[[\”s \ xE1lin hans j \ xF3ns m \ xEDns \“,0],[\”s \ xE1lin hans j \ xF3ns m \ xEDns undir \ xFE \ xEDnum   \ xE1hrifum \“,0],[\”s \ xE1lin hans j \ xF3ns m \ xEDns \ xFE \ xFA fullkomnar   mig \“,0],[\”s \ xE1lin \“,0],[\”s \ xE1lin hans j \ xF3ns m \ xEDns   s \ xF3d \ xF3ma \“,0],[\”s \ xE1lin hans j \ xF3ns m \ xEDns hj \ xE1   \ xFE \ xE9r \“,0],[\”s \ xE1lin hans j \ xF3ns m \ xEDns hvar er   draumurinn \“,0],[\”s \ xE1lin hans j \ xF3ns m \ xEDns   原始的“,0”,[\“s \ xE1lin汉斯j \ xF3ns m \ xEDns ef \ xE9g   \ xE6tti \“,0],[\”s \ xE1lin hans j \ xF3ns m \ xEDns okkar   Ñ\ xF3tt \ “0]],{\ ”Q \“:\ ”zLVSFcDtEbR_JBE4te2_XjMOeRs \“,\ ”K \“:1}])”

执行请求或处理响应以获得真实响应时,我该怎么办?

  

“window.google.ac.h([\”sálin\“,[[\”sálinhansjónsmíns\“,0],[\”sálinhansjónsmíns等......

1 个答案:

答案 0 :(得分:0)

想出这个:)我只需要设置用户代理,以便接收UTF-8编码的结果,就像这样

    # escape the query
    q=URI::escape(params["q"])
    # prepare request 
    uri = URI.parse("http://clients1.google.com/complete/search?client=youtube&q="<<q)
    http = Net::HTTP.new(uri.host, uri.port)
    request = Net::HTTP::Get.new(uri.request_uri)
    request["User-Agent"] = "Mozilla/5.0"
    # make request
    response = http.request(request)
    # read body
    body = response.body

现在我得到了正确的编码结果。但是,我尝试使用render :json => results将结果作为json返回,并且不幸的是,进入浏览器的结果仍会显示几个。当我想出来的时候,我会对此发表评论:)

修改 完成!我正在处理结果并直接从正文中将数据添加到数组中,但我需要做的是强制编码为UTF-8

    body = body[body.index('(')..body.index('{')]    
    body.scan(/"([^"]*)"/).to_a.each { |r| results.push r[0].force_encoding(::Encoding::UTF_8) }
    results = results[1..results.length].map {|v| v }

现在我正确地将结果发送到浏览器:)希望这有助于某人。