2010-12-02 3 views
2

У меня есть приложение Ruby/Rails.Проблема с кодировкой Ruby UTF8

У меня есть таблица художников в моей базе данных postgresql, которую я хочу запросить по имени. У меня есть некоторые художники с португальскими персонажами и т. Д., И у меня есть некоторые проблемы, связанные с ними.

Например, одна полоса называется Legião Urbana. Если я запрос со строкой «Легией» из моего приложения я получаю следующую Params:

{"action"=>"search_artist", "q"=>"legi\343", "controller"=>"home"} 

Однако я получаю ошибку из запроса

Artist.all(:conditions => "name LIKE '%#{params[:q]}%'") 

PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xe32527 

Что я должен делать, чтобы преобразовать в UTF8 или исправить это от чего-то?

ответ

4

Я думаю, что это может сделать это

require 'iconv' 
Iconv.conv("UTF8", "LATIN1", params[:q]) 
5

Вам нужно знать, что такое кодировка этого параметра в строке запроса.

Ruby 1.9 включает поддержку строк, отмеченных их кодировками. В Ruby 1.9, вы можете:

params[:q].encoding # Rails 3 on 1.9 generally presents strings in UTF-8 
params[:q].encode('utf-8') # ask Ruby to re-encode it to UTF-8 

Затем вам нужно преобразовать параметр из этой кодировки в UTF-8, прежде чем делать строковую интерполяцию (#{...} синтаксиса).

Или вам необходимо передать параметр как параметр SQL, не с использованием строковой интерполяции.

Конечно, это вызывает соображения безопасности, что, если вы не знаете, как правильно закодировать текст для использования в SQL, вы должны never выполнить строчную интерполяцию для создания фрагментов строки SQL. Поскольку SQL-фрагменты с параметрами быстро и легко выполняются в Rails, вы должны их использовать.

# Rails 2 
Artist.all(:conditions => ['name like ?', "%#{params[:q]}%"]) 
Artist.all(:conditions => ['name like :q', { :q=> "%#{params[:q]}%" }]) 

# Rails 3 
Artist.where('name like ?', "%#{params[:q]}") 
Artist.where('name like :q', :q => "%#{params[:q]}") 

SQL инъекция является проблема безопасности, которая возникает, когда вы делаете строковые интерполяции и кодировать строки таким образом, что строит правильные фрагменты SQL для некоторых входных строк, но не для других. В языках/структурах, с которыми параметры труднее работать, было бы приемлемо выполнять строчную интерполяцию или строковое построение (если остается легко выполнить строчную интерполяцию или строковое построение), если вы подробно исследуете, как вы требуются для кодирования интерполированных строк для создания правильных фрагментов SQL, независимо от входной строки. Поскольку SQL-инъекцию так легко избежать с помощью Rails с помощью упорядоченных или именованных параметров (см. Четыре примера выше), у вас не должно быть никаких проблем, гарантирующих безопасность ваших фрагментов SQL.

+0

Хорошо, это больше кодирования/преобразования, что мне было интересно. Как вы находите кодировку параметра? Я знаю проблему SQL-инъекции, но я просто хотел привести пример запроса. – johnnymire 2010-12-02 16:37:16

Смежные вопросы