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