0
我有一點我的Ruby/Rails(Ruby 2.0.0p195,Rails 3.2.13)項目,作爲代理工作;也就是說,您將它傳遞給一個URL,它會跳出並提取該頁面,並將其呈現給您。這通常按預期工作,但似乎困擾某些字符(如è)。Rails/unicode問題
控制器的簡化版本是這樣的:
class HomeController < ApplicationController
def geoproxy
require 'net/http'
require 'timeout'
rawurl = CGI::unescape(params[:url])
fixedurl = rawurl.gsub('\\', '%5C') # Escape backslashes... why oh why???!?
r = nil;
status = 200
content_type = ''
begin
Timeout::timeout(15) { # Time, in seconds
if request.get? then
res = Net::HTTP.get_response(URI.parse(fixedurl))
status = res.code # If there was an error, pass that code back to our caller
@page = res.body.encode('UTF-8')
content_type = res['content-type']
end
}
rescue Timeout::Error
@page = "TIMEOUT"
status = 504 # 504 Gateway Timeout We're the gateway, we timed out. Seems logical.
end
render :layout => false, :status => status, :content_type => content_type
end
end
的相應的視圖是很簡單:
<%= raw @page %>
當我使用這個代理來獲取包含E(例如)XML,我得到以下錯誤:
Encoding::UndefinedConversionError in HomeController#geoproxy
"\xE8" from ASCII-8BIT to UTF-8
在下面的行會出現此錯誤:
@page = res.body.encode('UTF-8')
如果我刪除.encode(),錯誤是解決了,但我的XML包含一個佔位符,而不是電子。
如何讓我的項目正確顯示XML?
讓我非常震驚和驚訝,你的建議奏效了。另一種也可以工作的方法是,我更喜歡出於某種原因,這是:@page = res.body.force_encoding('ISO-8859-1')。encode('UTF-8')。你有什麼想法_why_這有效嗎? – Watusimoto
不同的字符集可能表示相同的字符。在這種情況下,由於兩個字符集都能夠將字符'è'轉換爲'00E8'或'\ xE8',這兩種編碼都會產生相同的結果是正常的。也可能有其他字符集可以做到這一點。你只要確定你使用的編碼類型能夠處理你從'res.body'中得到的字符類型。 –
我理解這一點,但不是爲什麼要對一個字符集進行force_encoding,然後以UTF編碼進行重新編碼。我知道Ruby默認爲UTF-8,所以我不確定爲什麼必須設置編碼,也不知道爲什麼簡單地用UTF-8編碼不起作用。 – Watusimoto