プロキシとして機能する Ruby/Rails (Ruby 2.0.0p195、Rails 3.2.13) プロジェクトが少しあります。つまり、URL を渡すと、外部に出てページを取得し、表示します。これは通常、期待どおりに機能しますが、特定の文字 (è など) を変更しているようです。
コントローラーの簡略化されたバージョンは次のとおりです。
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 %>
このプロキシを使用して è を含む XML を取得すると (たとえば)、次のエラーが発生します。
Encoding::UndefinedConversionError in HomeController#geoproxy
"\xE8" from ASCII-8BIT to UTF-8
このエラーは次の行で発生します。
@page = res.body.encode('UTF-8')
.encode() を削除すると、エラーは解決されますが、XML には è の代わりにプレースホルダーが含まれています。
プロジェクトで XML を適切に表示するにはどうすればよいですか?