【问题标题】:mime body guess charset (and convert to UTF-8)mime body guess charset(并转换为 UTF-8)
【发布时间】:2012-06-02 09:09:49
【问题描述】:

我正在尝试解析传入的电子邮件并希望将正文作为UTF-8 编码字符串存储在数据库中,但是我很快注意到并非所有电子邮件都在Content-Type 中发送字符集信息标题。在尝试使用 String.force_encodingString.encode 进行一些手动快速修复后,我决定询问 SO 的友好人士。

说实话,我暗暗希望String.encoding 自动返回字符串中使用的编码,但是在我向它发送测试电子邮件后它总是出现ASCII-8BIT。当我将quoted-printable 作为一个选项实施时,我开始遇到这个问题,如果我还获得了一些;charset=blabla 信息,这似乎可以工作。

input = input.gsub(/\r\n/, "\n").unpack("M*").first
if( charset )
  return input.force_encoding(charset).encode("utf-8")
end

# This is obviously wrong as the string is not always ISO-8859-1 encoded:
return input.force_encoding("ISO-8859-1").encode("utf-8")

我一直在尝试我在互联网上找到的几种“解决方案”,但大多数似乎与文件读取/写入有关,并尝试了一些用于检测编码的 gem(但是似乎没有一个真正起作用或被令人难以置信的过时)。这应该是可能的,感觉好像答案就在我眼前,希望这里的人能够对我的情况有所了解并告诉我我做错了什么。

  • 使用 ruby​​ 1.9.3

【问题讨论】:

    标签: ruby utf-8 mime quoted-printable


    【解决方案1】:

    你试过https://github.com/fac/cmess吗?

    == 描述

    CMess 在其底层捆绑了几个工具,旨在处理 在字符集的上下文中发生的各种问题和 编码。目前有:

    guess_encoding:: 识别给定编码的简单助手 细绳。 包括自动检测编码的能力 输入。

    [...]

    【讨论】:

      【解决方案2】:

      您可以使用https://github.com/janx/chardet 来检测您的电子邮件文本的原始编码。

      此处示例:

      irb(main):001:0> require 'rubygems'
      => true
      irb(main):002:0> require 'UniversalDetector'
      => false
      irb(main):003:0> p UniversalDetector::chardet('hello')
      {"encoding"=>"ascii", "confidence"=>1.0}
      => nil
      

      【讨论】:

      • 嗯,这似乎是实际 chardet gem 的一个端口。原来的一加载就坏了,但我回家后会试一试并发布结果。
      • 这个版本的 gem 似乎也有点过时了,这取决于我插入测试字符串的方式,它要么只是以 1.0 的置信度表示 ASCII,要么它给出了一个 can't convert String into Integer,它似乎起源于 @987654325 @ 在这条线上 byteCls = @_mModel['classTable'][c] 但我需要进一步调查,看看我是否能解决这个问题。
      • 初步测试似乎很有希望。在我的本地机器 (Mac) 上安装 ICU 库时遇到了一些麻烦,但最终解决了,而且它似乎相当聪明。当字符串非常小时它并不完美,但对于现实世界它可能证明足够有用。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多