Несовместимая кодировка символов в рельсах - как разумно провалиться / пропустить?

У меня возникла проблема при импорте тем электронной почты через 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

Это должно привести все основные части в строки / текст, с которыми вы можете легко работать, и которые не будут терпеть неудачу, если что-то пропущено / необычно... и т. Д. Надеюсь, это поможет кому-то...

Другие вопросы по тегам