在使用MimeKit将.eml文件转换为.msg文件时,我遇到了一个似乎与编码有关的问题。
例如,使用包含以下内容的EML文件:
--__NEXTPART_20160610_5EF5CF91_471687D
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
添付ファイル名テスト结果是正文内容中的垃圾:
・Y・t・t・@・C・・・シ・e・X・g此外,在读取ü文件时,基-64编码的??字符将显示为??。我已经下载了MimeKit的最新版本,但这似乎没有什么区别。
.eml文件与Outlook 2016一起正确打开,但使用MimeKit似乎无法正确读取和解码这些文件。
发布于 2017-03-27 18:27:26
上面的MIME片段有一些问题:
Content-Transfer-Encoding: 7bit显然不是真的,也不太可能是问题所在(因为这个原因,MimeKit忽略了7bit和8bit的值)。
然而,最重要的是,字符集参数是iso-2022-jp,但内容本身显然不是iso-2022-jp (看起来像utf-8)。
当您获得TextPart.Text值时,MimeKit通过使用在Content-Type头中指定的字符集转换原始流内容来获得该字符串。如果这是错误的,那么Text属性也会有错误的值。
好消息是,TextPart有允许您指定字符集覆盖的GetText方法。
我建议尝试:
var text = part.GetText (Encoding.UTF8);看看能不能。
FWIW,iso-2022-jp是一种编码,它强制日语字符形成一个7位的ascii格式,看起来像完全的拼凑。如果是在iso-2022-jp中,这就是你的日语文本的样子。
BE:IU%U%!%$%kL>%F%9%H所以我才知道这不是iso-2022-jp :)
更新:
最终,解决方案可能是这样的:
var encodings = new List<Encoding> ();
string text = null;
try {
var encoding = Encoding.GetEncoding (part.ContentType.Charset,
new EncoderExceptionFallback (),
new DecoderExceptionFallback ());
encodings.Add (encoding);
} catch (ArgumentException) {
} catch (NotSupportedException) {
}
// add utf-8 as our first fallback
encodings.Add (Encoding.GetEncoding (65001,
new EncoderExceptionFallback (),
new DecoderExceptionFallback ()));
// add iso-8859-1 as our final fallback
encodings.Add (Encoding.GetEncoding (28591,
new EncoderExceptionFallback (),
new DecoderExceptionFallback ()));
for (int i = 0; i < encodings.Count; i++) {
try {
text = part.GetText (encodings[i]);
break;
} catch (DecoderFallbackException) {
// this means that the content did not convert cleanly
}
}https://stackoverflow.com/questions/43052939
复制相似问题