0

プロキシとして機能する 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 を適切に表示するにはどうすればよいですか?

4

1 に答える 1