Ruby Sinatra/Rack因url中的非ascii字符而失败

Ruby Sinatra/Rack因url中的非ascii字符而失败,ruby,sinatra,rack,Ruby,Sinatra,Rack,我在/find/Wrocław处得到Encoding::UnfinedConversionError 从ASCII-8BIT到UTF-8的“\xC5” 出于某种神秘的原因,sinatra正在以ASCII而不是UTF-8的形式传递字符串 我找到了一些丑陋的解决办法。。。我不知道为什么Rack假设编码是ASCII-8BIT。。。无论如何,一种方法是使用string.force_编码(“UTF-8”)。。。但是,对所有参数执行此操作是乏味的我在路由到“/protégés/:id”时遇到了一些类似的问题

我在/find/Wrocław处得到Encoding::UnfinedConversionError 从ASCII-8BIT到UTF-8的“\xC5”

出于某种神秘的原因,sinatra正在以ASCII而不是UTF-8的形式传递字符串


我找到了一些丑陋的解决办法。。。我不知道为什么Rack假设编码是ASCII-8BIT。。。无论如何,一种方法是使用string.force_编码(“UTF-8”)。。。但是,对所有参数执行此操作是乏味的

我在路由到“/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服务器中进行设置,具体取决于您在站点上使用的不同编码数量。

AFAIK URL中不应包含原始UTF-8字符,但必须对其进行%编码 ,不这样做可能会导致与标准兼容的代理出现各种问题。看起来这不是机架问题,而是应用程序发出无效URL的问题。HTTP头中的字符集和编码信息应用于内容,而不是头本身

引用

当一个新的URI方案定义了一个表示由通用字符集[UCS]中的字符组成的文本数据的组件时,应首先根据UTF-8字符编码[STD63]将数据编码为八位字节;然后,只有那些与未保留集中的字符不对应的八位字节才应该进行百分比编码。例如,字符A将表示为“A”,带有坟墓的拉丁大写字母A将表示为“%C3%80”,而片假名字母A将表示为“%E3%82%A2”


请问您是在哪里添加了string.force_编码(“UTF-8”)行的?