Проблема с кодировкой символов вложений с использованием gmail gem в ruby ​​/ rails - PullRequest
0 голосов
/ 17 ноября 2018

Что я делаю: Я использую гем gmail в приложении Rails 4 для получения вложений электронной почты из определенной учетной записи через регулярные промежутки времени.Вот выдержка из основной части (здесь для простоты рассматривается только первое письмо и его первое вложение):

require 'gmail'

Gmail.connect(@user_email,@user_password) do |gmail|
    if gmail.logged_in? 
        emails = gmail.inbox.emails(:from => @sender_email)
        email = emails[0]
        attachment = email.message.attachments[0]
        File.open("~/temp.csv", 'w') do |file| 
            file.write(
                StringIO.new(attachment.decoded.to_s[2..-2].force_encoding("ISO-8859-15").encode!('UTF-8')).read
            )
        end
    end
end

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

Это , что я ожидаю получить , когда я запускаю приведенный выше код.(Это то, что я получаю, когда загружаю вложение вручную через пользовательский интерфейс Gmail): This is what I expect to get (and what I get when I download the attachment manually)

В чем проблема:

Однако я получаю следующие странные результаты.

С cat temp.csv (выглядит хорошо для меня): This is from a cat temp.csv (looks good)

С nano temp.csv (Здесь у меня естьПонятия не имею, на что я смотрю): This is what it looks like with nano temp.csv

Вот так выглядит файл temp.csv, открытый в Sublime Text (непосредственно через winscp).Первая строка и мелкие детали выглядят хорошо, но затем китайские / японские символы: This is what temp.csv looks like opened in Sublime Text (via winscp)

Так выглядит temp.csv в Блокноте (после загрузки через winscp).Выглядит нормально, за исключением того, что между каждым символом вставлено пустое пространство, а новые строки отсутствуют: what temp.csv looks like in Notepad

Что я пробовал:

У меня безуспешно пробовал:

  • .force_encoding(...) со всеми различными наборами символов "ISO-8859-x"
  • , помещая force_encoding("ISO-8859-15").encode!('UTF-8') за пределами .read (работает, но не решает проблему)
  • кодирует в UTF-8, не форсируя сначала другое кодирование, но это приводит к Encoding::UndefinedConversionError: "\xC4" from ASCII-8BIT to UTF-8
  • записи в двоичном виде с 'wb' и 'w+b' в File.open() (что, как ни странно, никак не влияет на результат).
  • поиск в стеке потока и в Интернете другие идеи.

Любые идеи будут высоко оценены!

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Похоже, вам нужно сделать attachment.body.decoded вместо attachment.decoded

0 голосов
/ 18 ноября 2018

Не красиво, но теперь оно будет работать для меня.

После перекодирования я преобразую строку в массив символов, затем удаляю ненужные символы и затем соединяю оставшиеся элементы массива, чтобы сформировать строку.

decoded_att = attachment.decoded
data = decoded_att.encode("UTF-8", "ISO-8859-1", invalid: :replace, undef: :replace).gsub("\r\n", "\n")

data_as_array = data.chars
data_as_array = data_as_array.delete_if {|i| i == "\u0000" || i == "ÿ" || i == "þ"}
data = data_as_array.join('').to_s

File.write("~/temp.csv", data.to_s)

Это будет работать для меня сейчас. Однако я понятия не имею, как эти символы оказались во вложении ("ÿ" и "þ" в начале документа и "\u0000" между всеми остальными символами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...