Синатра / Rack терпит неудачу с не-ASCII символов в URL - PullRequest
3 голосов
/ 22 декабря 2009

Я получаю кодировку :: UndefinedConversionError в / find / Wrocław "\ xC5" от ASCII-8BIT до UTF-8

По какой-то таинственной причине sinatra передает строку как ASCII вместо UTF-8, как и должно быть.

Я нашел какой-то уродливый обходной путь ... Я не знаю, почему Rack предполагает, что кодировка ASCII-8BIT ... в любом случае, есть способ использовать string.force_encoding ("UTF-8") .. но делать это для всех параметров утомительно

Ответы [ 2 ]

3 голосов
/ 29 января 2010

У меня были похожие проблемы с маршрутизацией в "/ 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 или на вашем веб-сервере, в зависимости от того, сколько разных кодировок вы используете на своем сайте.

2 голосов
/ 20 марта 2010

AFAIK Вы не должны иметь необработанные символы UTF-8 в URL, но должны кодировать их% Если вы этого не сделаете, то, скорее всего, вызовете все проблемы со стандартными прокси-серверами. Похоже, это не столько проблема с Rack, сколько проблема с приложением, генерирующим недействительные URL. Информация о кодировке и кодировке в заголовке HTTP применяется к содержимому, а не к самому заголовку.

Цитировать RFC 3986

Когда новая схема URI определяет компонент, который представляет текстовые данные, состоящие из символов из универсального набора символов [UCS], данные должны сначала быть закодированы как октеты в соответствии с кодировкой символов UTF-8 [STD63]; тогда только те октеты, которые не соответствуют символам в незарезервированном наборе, должны кодироваться в процентах. Например, символ A будет представлен как «A», символ LATIN CAPITAL LETTER A WITH GRAVE будет представлен как «% C3% 80», а символ KATAKANA LETTER A представлен как «% E3% 82% A2 ».

...