Несовместимая кодировка символов в рельсах - как разумно провалиться / пропустить?
У меня возникла проблема при импорте тем электронной почты через IMAP. У меня проблема, я думаю, связанная со знаком £ в темах электронной почты. Потратив пару часов в обход разных ответов, я не могу найти ничего, что работает... Если я попробую следующее...
Использование ruby 2.1.2 views / emails / index
=email.subject
incompatible character encodings: ASCII-8BIT and UTF-8
=email.subject.scrub
incompatible character encodings: ASCII-8BIT and UTF-8
= email.subject.encode!('UTF-8', 'UTF-8', :invalid => :replace)
invalid byte sequence in UTF-8
= email.subject.force_encoding('UTF-8')
invalid byte sequence in UTF-8
= email.subject.encode("UTF-8", invalid: :replace)
"\xA3" from ASCII-8BIT to UTF-8
/ xA3 - знак "£", который не должен быть таким необычным.
В настоящее время я работаю со следующим...
-if email.subject.force_encoding('UTF-8').valid_encoding?
=email.subject
-else
"Can't display"
В идеале я бы просто сделал что-то, что проверило бы работоспособность кодировки, а затем сделал что-то вроде #scrub… Я бы даже взял это с '/xA3' совершенно счастливо, пока оно не было ' Я выдал ошибку, и я смог увидеть текст.
Любые идеи о том, как сделать это правильно или выдумка, чтобы решить проблему?
1 ответ
После долгих болей я решил это.
Вам нужно добавить кодировку по умолчанию в ваш файл environment.rb, например так:
# Load the rails application
require File.expand_path('../application', __FILE__)
Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8
# Initialize the rails application
Stma::Application.initialize!
Очевидно, это как-то связано с корнями Руби в Японии. Когда имеешь дело с японскими (или русскими) символами, это не помогло бы, поэтому такого рода вещи не являются стандартными.
Затем я сделал следующее:
mail_object = Mail.new(mail[0].attr["RFC822"])
subject = mail_object.subject.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') if mail_object.subject
body_part = (mail_object.text_part || mail_object.html_part || mail_object).body.decoded
body = body_part.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') if body_part
from = mail_object.from.join(",") if mail_object.from #deals with multiple addresses
to = mail_object.to.join(",") if mail_object.to #deals with multiple addresses
Это должно привести все основные части в строки / текст, с которыми вы можете легко работать, и которые не будут терпеть неудачу, если что-то пропущено / необычно... и т. Д. Надеюсь, это поможет кому-то...