рубиновые 1.9 + sinatra несовместимые кодировки символов: ASCII-8BIT и UTF-8

Я пытаюсь переместить 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?

6
задан John 11 July 2010 в 15:14
поделиться

1 ответ

Я не знаком со спецификой вашей ситуации, но подобная ошибка возникала в Ruby 1.9 при попытке конкатенации строки в исходном коде (обычно закодированной в UTF-8) со строкой извне системы, например, вводом из HTML-формы или данными из базы данных.

ASCII-8BIT - это, по сути, синоним двоичного кода. Он указывает на то, что входная строка не была помечена фактической кодировкой, которая была использована (например, UTF-8 или ISO-8859-1).

Насколько я понимаю, в Ruby 1.8 сообщения об исключениях не встречаются, потому что он рассматривает строки как двоичные и молча конкатенирует строки разных кодировок. По тонким причинам это часто не является проблемой.

Вчера я столкнулся с похожей ошибкой и нашел этот отличный обзор.

Один из вариантов заставить сообщение об ошибке исчезнуть - использовать force_encoding('UTF-8') (или другую кодировку) для строки, поступающей из внешнего источника. Это не следует делать легкомысленно, и вы должны иметь представление о последствиях.

15
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: