2012-05-27 6 views
1

Я пытаюсь разобрать входящие сообщения электронной почты и хочу сохранить тело как закодированную строку UTF-8 в базе данных, однако я быстро заметил, что не все e -mails отправляет информацию о кодировке в заголовок Content-Type. Попробовав некоторые быстрые исправления вручную с String.force_encoding и String.encode, я решил спросить дружелюбных людей SO.mime body guess charset (и конвертировать в UTF-8)

Чтобы быть честным, я тайно надеялся на 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") 

Я экспериментировал с несколькими «решения» я нашел в Интернете, однако большинство, казалось, относятся к файлу для чтения/записи, и экспериментировал с несколькими камнями для обнаружения кодирования (однако никто на самом деле, казалось, не делать трюк или были невероятно устаревшими). Это должно быть возможно, и кажется, что ответ смотрит на меня прямо в лицо, надеюсь, кто-то здесь сможет пролить свет на мою ситуацию и рассказать мне, что я делал совершенно неправильно.

  • использованием Руби 1.9.3

ответ

0

Вы можете использовать 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 
+0

Хм, это, кажется, порт фактического 'chardet' камень. Оригинал ломается, как только вы пытаетесь загрузить его, но я попробую попробовать, когда вернусь домой и опубликую результаты. – CharlesLeaf

+0

Эта версия жемчужины также выглядит немного устаревшей, в зависимости от того, как я вставляю свою тестовую строку, она либо просто говорит ASCII с уверенностью 1.0, либо дает «не может преобразовать String в Integer», которая, похоже, исходит из 'CodingStateMachine. rb' в этой строке 'byteCls = @_mModel ['classTable'] [c]', но мне нужно провести дополнительное расследование, чтобы проверить, могу ли я это разрешить. – CharlesLeaf

+0

Как насчет этого: https://github.com/brianmario/charlock_holmes – Hooopo

0

Вы пробовали https://github.com/fac/cmess?

== ОПИСАНИЕ

CMess пучки несколько инструментов под его капотом, которые направлены на борьбу с различные проблемы, встречающиеся в контексте наборов символов и кодировки . В настоящее время существуют:

guess_encoding :: Простой помощник для идентификации кодировки заданной строки . Включает возможность автоматического обнаружения кодировки ввода .

[...]