Я пытаюсь переместить sinatra приложение в рубиновые 1.9
Я использую sinatra 1.0, устанавливаю в стойку 1.2.0 и шаблоны erb
когда я запускаю sinatra, он работает, но когда я запрашиваю веб-страницу от браузера, я получаю эту ошибку:
Encoding::CompatibilityError at /
incompatible character encodings: ASCII-8BIT and UTF-8
все .rb файлы имеют этот заголовок:
#!/usr/bin/env ruby
# encoding: utf-8
Я думаю, что проблема находится в erb файлах, даже если она показывает, что это - закодированный UTF-8
[user@localhost views]$ file home.erb
home.erb: UTF-8 Unicode text
у кого-либо была эта проблема прежде? разве sinatra не полностью совместим с рубиновыми 1.9?
Я не знаком со спецификой вашей ситуации, но подобная ошибка возникала в Ruby 1.9 при попытке конкатенации строки в исходном коде (обычно закодированной в UTF-8) со строкой извне системы, например, вводом из HTML-формы или данными из базы данных.
ASCII-8BIT - это, по сути, синоним двоичного кода. Он указывает на то, что входная строка не была помечена фактической кодировкой, которая была использована (например, UTF-8 или ISO-8859-1).
Насколько я понимаю, в Ruby 1.8 сообщения об исключениях не встречаются, потому что он рассматривает строки как двоичные и молча конкатенирует строки разных кодировок. По тонким причинам это часто не является проблемой.
Вчера я столкнулся с похожей ошибкой и нашел этот отличный обзор.
Один из вариантов заставить сообщение об ошибке исчезнуть - использовать force_encoding('UTF-8') (или другую кодировку) для строки, поступающей из внешнего источника. Это не следует делать легкомысленно, и вы должны иметь представление о последствиях.