ruby 1.9 + sinatra несовместимые кодировки символов: ASCII-8BIT и UTF-8 - PullRequest
6 голосов
/ 11 июля 2010

Я пытаюсь перенести приложение sinatra на ruby ​​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

Кто-нибудь имел эту проблему раньше?Синатра не полностью совместима с ruby ​​1.9?

Ответы [ 2 ]

15 голосов
/ 11 июля 2010

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

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

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

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

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

0 голосов
/ 09 мая 2014

У меня была такая же проблема.Проблема была в кодированном файле utf8, который должен быть us-ascii.

Я проверил, используя команду file (в OSX):

$ file --mime-encoding somefile
somefile: utf-8

После удаления странных символов из файла:

$ file --mime-encoding somefile
somefile: us-ascii

Это исправило проблему для меня.

...