RoR-кодирование темы письма из KOI8-R в UTF-8 не работает

#ruby-on-rails #ruby #encoding #utf-8

#ruby-on-rails #ruby #кодирование #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:

В качестве примера:

 # 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).