2015-05-12 4 views
0

Мы сталкиваемся с некоторыми проблемами с кодированием, особенно при использовании 8 бит в качестве кодирования передачи контента. Прежде всего, может ли кто-нибудь рассказать мне, как выглядит 8-битное кодированное значение a-umlaut?Кодирование содержимого с использованием MimeKit/MailKit

Что лучше всего применять для кодирования?

Я попытался использовать метод MIME WriteTo() для записи содержимого в поток, который работает в любых случаях, кроме 8-битного кодирования.

UPDATE: В настоящее время, используя код, как писал в одном из примеров MimeKit:

using (MemoryStream memStm = new MemoryStream()) 
{ 
    mime.WriteTo(memStm); 
    message.MimeMessage = Encoding.UTF8.GetString(memStm.ToArray()); 
} 

Но, похоже, какой-то двойной кодировки, когда мой MIME содержит специальные символы, такие как: ÄÂ приведет в чем-то вроде: ¿½

Как я могу избежать этих ситуаций двойного кодирования?

+2

Почему вы преобразовываете двоичные данные в строку? Содержимое, которое выводит MimeMessage.WriteTo(), никогда не должно быть преобразовано в строку для любого предполагаемого варианта использования. MimeMessage может иметь текст в нескольких кодировках во всех сообщениях, поэтому преобразование с использованием одной кодировки кодировки не может надежно работать. – jstedfast

+0

Мне нужен он Мим в качестве струны. message.MimeMessage - это просто свойство строки. Раньше я использовал mime.ToString() (mime - typeof MimeMessage API MailKit, извините за недоразумение), но у tostring есть проблемы с датскими символами, такими как æøå, поэтому я использую WriteTo(). Итак, у меня есть тип MailKit.MimeMessage, из которого я хочу строку, которую я могу отправить моему клиенту и представить как .mht-файл в моем IE. – grmihel

+0

Вы не можете использовать строку для этого, вам нужно использовать байт []. MIME - сложный документ, в котором каждый раздел может иметь свою собственную кодировку. Невозможно преобразовать составной документ с несколькими кодировками в строку с использованием одного конвертера кодировки. – jstedfast

ответ

2

8-битное кодирование передачи MIME в основном «без кодирования», поэтому любые данные MIME, закодированные с 8-битовым кодированием, совпадают с двоичным представлением данных в данной кодировке. Например, «ä» представлен в UTF-8 в виде следующей последовательности байтов: 0xC3, 0xA4. При использовании 8-битных данных MIME будут представлять собой ту же последовательность байтов. Другие кодировки передачи, такие как quoted-printable или base64, будут кодировать эти байты по-разному, например. как w6Q= или =C3=A4.

вынос в том, что MIME набор символов определяет, как символы представлены в двоичной форме и MIME содержимого кодирования передачи определяет, как эти байты получить закодированы в самой MIME документа.

Что касается лучших практик, современные почтовые серверы и клиенты с радостью будут иметь дело с 8-битными закодированными электронными письмами. Тем не менее, пользователь должен использовать либо quoted-printable, либо base64.

Что касается проблемы с двойным кодированием, то последовательность äÄ с двойным кодированием UTF-8 отличается от ¿½, поэтому я думаю, что там что-то не так. Я не знаком с MimeKit, и ваш образец кода не содержит достаточной информации, но если вы обновите свой вопрос с помощью более полного кода воспроизведения, я буду рад обновить свой ответ.

+0

Итак, если у меня есть mime-файл, это выглядит как Content-Type: text/plain; charset = "iso-8859-1"; Content-Transfer-Encoding: 8 бит; ä будет выглядеть как 0xC30xA4, если я посмотрю на необработанную строку? – grmihel

+0

@grmihel: Ну, в этом конкретном случае это будет один байт, 0xE4. Это потому, что 'iso-8859-1' может представлять символ' ä' и представляет его как один байт 0xE4 (см. Http://www.htmlhelp.com/reference/charset/iso224-255.html, 0xE4 = = 228 в десятичной системе). Однако, если ваш заголовок будет читать «Content-Type: text/plain; charset =« utf-8 »; Content-Transfer-Encoding: 8bit', вы получите два байта, о которых я говорил в своем ответе. – PeterK

Смежные вопросы