ActionMailer HTML编码地狱 - 特殊字符替换为垃圾

con*_*are 6 ruby encoding ruby-on-rails actionmailer utf-8

我有UTF-8字符串:Website • Facebook
这是中间的一个子弹aka •0xE2 0x80 0xA2

该值正确存储在数据库中,并使用Rails 3和ruby 1.9.3使用默认设置在屏幕上正确显示.

我试图通过HTML电子邮件发送此信息,但当完成所有操作后,接收端会看到垃圾:

在此输入图像描述

这背后的代码很简单,我有一个ActionMailer子类(默认情况下使用UTF-8)设置在布局中发送带有UTF-8内容编码的HTML电子邮件:

email.html.erb 布局文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="chrome=1,IE=9" />       
    <meta charset="utf-8">
    <%= stylesheet_link_tag "application", :media => "all" %>       
</head>
<body class='email'>
    <%= yield %>                        
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

内容使用相同的视图来呈现网页,重要的一行是:

<p><%= simple_format strip_tags(comment.text) %></p>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多很多的排列force_encoding,encode,将多余的UTF-8编码的ActionMailer子类,视图文件和其他十几个事情,但没有顶部似乎工作.

通过Apple Mail 的原始html消息查看的重要HTML 是:

Website =EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD Facebook
Run Code Online (Sandbox Code Playgroud)

如果您查看原始消息(上面链接),则不会在纯文本消息上发生这种情况,只会发生HTML消息.

TL; DR

ActionMailer正在替换应该是UTF-8项目符号:0xE2 0x80 0xA2
垃圾:0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD 0xEF 0xBF 0xBD

我怎样才能解决这个问题?

mcc*_*nnf 2

检查您是否使用 gem 来内联 CSS,例如premailer-rails3.

根据这篇文章,这可能会损坏您的 ActionMailer 电子邮件中的 UTF-8 字符。

尝试移除宝石或用类似actionmailer_inline_css宝石的东西替换宝石。