Удалите из строки символы, размер байтов которых больше 2 с помощью Ruby - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблема с mysql и некоторыми персонажами.Если пользователь вводит "hello ●", я получаю эту ошибку:

Mysql2::Error: Incorrect string value: '\\xE2\\x97\\x8F he...' for column 'subject'

Я хотел бы исключить все символы, байт которых больше двух, т. Е. Оставить французские символы, такие как é, à,ç и удалите смайлики или символы, такие как .

Учитывая string = "hèllö>●!", я хотел бы получить "hèllö>!".Для этого я написал следующее:

def bytesize(var)
   var.each_char do |char|
      puts char.bytesize
   end
end

bytesize(string)
1
2
1
1
2
1
3
1
# => "hèllö>●!"

, что я не ожидал.Каков наилучший способ удалить из всех символов, чей байтовый размер больше двух в строке?

Я не делаю этого в модели, потому что я могу справиться с этим с помощью гема, но моя проблема возникает, когдаработа хочет поместить строку в журналы Amazon SES.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Развитие усилий ОП, без использования регулярных выражений:

string = "hèllö>●!"

cleaned = string.each_char.with_object("") do |char, str|
   str << char unless char.bytesize > 2
end

p cleaned
0 голосов
/ 20 сентября 2018

Я подозреваю, что вы получаете это сообщение об ошибке, потому что у вас неправильная кодировка текста столбца.Если вы используете Unicode в своей системе, и в этот день и возраст вы должны быть, тип столбца должен быть utf8mb4.См. this о том, как изменить типы столбцов.

Принимая во внимание ваш комментарий, следующее удалит все символы за пределами BMP

sentence.gsub(/[\u{10000}-\u{10FFFF}]/,'')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...