3

/find/Wrocław "\xC5" で Encoding::UndefinedConversionError を取得しています ASCII-8BIT から UTF-8 へ

不思議な理由で、sinatra は文字列を本来の UTF-8 ではなく ASCII として渡しています。

ある種の醜い回避策を見つけました... RackがエンコーディングがASCII-8BITであると想定する理由がわかりません... とにかく、方法は string.force_encoding("UTF-8") を使用することです...しかし、これはすべてのパラメーターに対して面倒です

4

2 に答える 2

3

「/protégés/:id」へのルーティングで同様の問題が発生していました。Rackメーリングリストに投稿しましたが、反応は良くありませんでした。

私が思いついた解決策は完璧ではありませんが、ほとんどの場合は機能します。まず、UTF-8をエンコード解除するミドルウェアを作成します。

# in lib/fix_unicode_urls_middleware.rb:
require 'cgi'
class FixUnicodeUrlsMiddleware
  ENVIRONMENT_VARIABLES_TO_FIX = [
    'PATH_INFO', 'REQUEST_PATH', 'REQUEST_URI'
  ]

  def initialize(app)
    @app = app
  end

  def call(env)
    ENVIRONMENT_VARIABLES_TO_FIX.each do |var|
      env[var] = CGI.unescape(env[var]) if env[var] =~ /%[A-Za-z0-9]/
    end
    @app.call(env)
  end
end 

次に、そのミドルウェアをconfig/environment.rb(Rails 2.3)またはconfig/application.rb(Rails 3)で使用します。

また、正しいエンコーディングHTTPヘッダーを設定していることを確認する必要があります。

Content-type: text/html; charset=utf-8

サイトで使用するさまざまなエンコーディングの数に応じて、Rails、Rack、またはWebサーバーで設定できます。

于 2010-01-29T15:59:41.617 に答える
2

私の知る限り、URLに生のUTF-8文字を含めることは想定されていませんが、それらを%エンコードする必要があります。そうしないと、標準準拠のプロキシなどであらゆる種類の問題が発生する可能性があります。ラックの問題ではなく、無効な URL を発行するアプリケーションの問題のようです。HTTP ヘッダーの文字セットとエンコード情報は、ヘッダー自体ではなくコンテンツに適用されます。

RFC 3986を引用するには

新しい URI スキームが Universal Character Set [UCS] の文字で構成されるテキスト データを表すコンポーネントを定義する場合、データは最初に UTF-8 文字エンコーディング [STD63] に従ってオクテットとしてエンコードする必要があります。次に、予約されていないセットの文字に対応しないオクテットのみをパーセントでエンコードする必要があります。たとえば、文字 A は "A" と表され、文字 LATIN CAPITAL LETTER A WITH GRAVE は "%C3%80" と表され、文字 KATAKANA LETTER A は "%E3%82%A2" と表されます。 "。

于 2010-03-20T15:06:00.433 に答える