2014-09-08 2 views
0

У меня возникла проблема с копированием и вставкой пользователей, что приводит к непечатаемым символам, которые не позволяют MySQL сохранять записи. Вот ошибка:Как я могу отделить непечатаемые символы юникода от ввода пользователя в Rails 4?

Mysql2::Error: Incorrect string value: '\xE2\x80\x8B\xE2\x80\x8B...' for column 'address' at row 1 

Я не нахожу существующие ответы на подобные вопросы удовлетворительными, так как они, кажется, все требуют от меня, чтобы изменить базу данных, чтобы принять эти символы Юникода. Но я не хочу спасать этих персонажей! Я бы скорее их вычеркнул и сохранил действительные символы ASCII.

Каков наилучший/предпочтительный способ сделать это? До сих пор я наткнулся на следующие методы:

"offending string".encode(Encoding.find('ASCII'), {invalid: :replace, undef: :replace, replace: "", universal_newline: true}) 

Это, кажется, работает большую часть времени, за исключение того, чтобы компенсировать нулевые поля я должен использовать трехкомпонентное выражение на каждое поле. Серьезный запах кода!

Тогда это:

.gsub(/(\W|\d)/, "") 

Что делает часть того, что я хочу, но он также удаляет символы, такие как кавычки.

Я бы предпочел настройку, которую я могу изменить, а не прикоснуться к вызовам метода к моим параметрам.

ответ

0

Я думаю, что вы на правильном пути с командой gsub.

Вы никогда не хотите вводить пользовательский ввод непосредственно в свою базу данных, не очищая его. Это может привести к серьезным угрозам безопасности (просто Google «SQL Injections»).

Взгляните на следующие ссылки: http://apidock.com/ruby/String/gsub http://www.oreillynet.com/pub/a/ruby/excerpts/ruby-learning-rails/ruby-guide-regular-expressions.html

Это позволит вам построить регулярное выражение, чтобы быть первым аргументом команды GSUB, и вы можете оставить второй аргумент как пустая строка в полоса их. Вы сказали, что вы не хотите использовать команду GSUB вас в курсе, потому что он также полосы кавычки и другие символы, которые вы хотите сохранить ...

Попробуйте что-то вроде:

"offending string".gsub(/(\W|\d|^(\"|\.))/, "") 

Это должно позволить вам захватить все символы, которые

  1. не символы слова
  2. цифры
  3. не процитировать символов и
  4. не точка символов

И заменить их на пустую строку («»), которые эффективно лишающей их.

(Пожалуйста, проверьте регулярное выражение, и если он не делает то, что вы хотите, консультируется ссылки я разместил и строить и перебирать, пока вы не получите то, что работает.)

Оттуда вы можете сделать что-то вроде сообщить что они должны повторно ввести свой ввод или сообщить им, что вы не будете принимать числа или специальные символы или что-то еще ...

Надеюсь, это поможет.