有与你上面MIME片段:(
Content-Transfer-Encoding: 7bit
几个问题显然是不正确的,本书虽然这不太可能是问题(MimeKit忽略的7bit
和8bit
值这个原因)。
最重要的,然而,这是事实,charset参数是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
是一种强制日语字符变成7bit 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
}
}
编辑是非常... nitpicky? 我不介意,但如果我们要挑剔,我们至少可以让挑剔一致吗? 换句话说,MimeKit被编辑为“MimeKit”一次,但另一个实例保留在原始字体中。 另外,。在一个实例中,eml被挑选为'.eml',但在随后的实例中没有。 谢谢 –