2013-07-17 78 views
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?

回答

1

你能否檢查下面的代碼是否適合你?我能夠用它解決類似的問題。

@page = res.body.force_encoding('Windows-1254').encode('UTF-8') 
+1

讓我非常震驚和驚訝,你的建議奏效了。另一種也可以工作的方法是,我更喜歡出於某種原因,這是:@page = res.body.force_encoding('ISO-8859-1')。encode('UTF-8')。你有什麼想法_why_這有效嗎? – Watusimoto

+0

不同的字符集可能表示相同的字符。在這種情況下,由於兩個字符集都能夠將字符'è'轉換爲'00E8'或'\ xE8',這兩種編碼都會產生相同的結果是正常的。也可能有其他字符集可以做到這一點。你只要確定你使用的編碼類型能夠處理你從'res.body'中得到的字符類型。 –

+0

我理解這一點,但不是爲什麼要對一個字符集進行force_encoding,然後以UTF編碼進行重新編碼。我知道Ruby默認爲UTF-8,所以我不確定爲什麼必須設置編碼,也不知道爲什麼簡單地用UTF-8編碼不起作用。 – Watusimoto