从KOI8-R到UTF-8的邮件主题的RoR编码不起作用

时间:2014-06-18 13:18:49

标签: ruby-on-rails ruby encoding utf-8

我在Ruby on Rails中解决邮件主题问题。 我尝试编码邮件主题:“=?KOI8-R?B?z9Qg09XQxdLXwcraxdLB?=” 的

<% if /koi8-r/ =~ msg.subject or /KOI8-R/ =~ msg.subject %>
<% subj = msg.subject.gsub(/=\?.*\?B\?/, '') %>
<% subj = subj.gsub(/\?=/, '') %>
<%= Base64.decode64(subj).force_encoding("KOI8-R").encode("UTF-8", :invalid=>:replace, :replace=>"?")

的 并得到错误: 不兼容的字符编码:ASCII-8BIT和UTF-8

但如果我在irb中这样做,一切正常: 的

2.0.0p247 :009 > subj = "z9Qg09XQxdLXwcraxdLB"
 => "z9Qg09XQxdLXwcraxdLB"
2.0.0p247 :010 >  Base64.decode64(subj).force_encoding("KOI8-R").encode("UTF-8", :invalid=>:replace, :replace=>"?")
 => "от супервайзера"
2.0.0p247 :011 >

为什么我的代码不起作用?

1 个答案:

答案 0 :(得分:0)

举个例子:

# My starting string:
rus = "привет"

# generate fake email subject
require 'mail'
msg_subject = Mail::Encodings.decode_encode(rus.encode(Encoding::KOI8_R), :encode)
# => "=?KOI8-R?B?0NLJ18XU?="


Mail::Encodings.value_decode("=?KOI8-R?B?0NLJ18XU?=")
=> "привет"

这将以UTF-8(ruby默认值)返回。如果你想把它送到KOI8_R你可以再次编码(或者你感觉有风险,.force_encoding)。