【问题标题】:Problem with attachments' character encoding using gmail gem in ruby/rails在 ruby​​/rails 中使用 gmail gem 的附件字符编码问题
【发布时间】:2018-11-17 19:27:53
【问题描述】:

我在做什么: 我在 Rails 4 应用程序中使用 gmail gem 定期从特定帐户获取电子邮件附件。以下是核心部分的摘录(此处为简单起见,仅考虑第一封电子邮件及其第一个附件):

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 用户界面手动下载附件时得到的):

问题是什么:

但是,我得到了以下奇怪的结果。

来自cat temp.csv(我觉得不错):

使用nano temp.csv(这里我不知道我在看什么):

这就是在 Sublime Text 中打开的 temp.csv 的样子(直接通过 winscp)。第一行和小部分看起来不错,但随后是中文/日文字符:

这是 temp.csv 在记事本中的样子(通过 winscp 下载后)。看起来不错,除了在每个字符之间插入了一个空格并且新行似乎丢失了:

我尝试过的:

没有成功尝试过:

  • .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
  • File.open() 中使用'wb''w+b' 以二进制形式写入(奇怪的是,这似乎对结果没有影响)。
  • 在 stackoverflow 和网络上搜索其他想法。

任何想法都将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby character-encoding gmail


    【解决方案1】:

    不漂亮,但它现在对我有用。

    重新编码后,我将字符串转换为 char 数组,然后删除我不想要的 char,然后将剩余的数组元素连接起来形成字符串。

    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" 在所有剩余字符之间)。

    【讨论】:

      【解决方案2】:

      您似乎需要使用attachment.body.decoded 而不是attachment.decoded

      【讨论】:

      • 谢谢。实际上, attachment.body.decoded 和 attachment.decoded 似乎返回完全相同的字符串。我检查了字符串和它们的字节数组。
      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多