C# MimeKit字符编码/解码问题

C# MimeKit字符编码/解码问题,c#,email,character-encoding,mimekit,C#,Email,Character Encoding,Mimekit,使用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 此外,读取EML文件时,base-64编码

使用
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
此外,读取EML文件时,base-64编码的
字符将显示为
。我已经下载了MimeKit的最新版本,但似乎没有什么不同


.eml文件使用Outlook 2016可以正常打开,但使用MimeKit似乎无法正确读取和解码文件。

上述MIME代码段存在一些问题:(

Content-Transfer-Encoding:7bit
显然不是真的,尽管这不太可能是问题所在(出于这个原因,MimeKit忽略了
7bit
8bit
的值)

然而,最重要的是,字符集参数是
iso-2022-jp
,但内容本身显然不是
iso-2022-jp
(看起来像
utf-8

当您获取
TextPart.Text
值时,MimeKit通过使用
content Type
标题中指定的字符集转换原始流内容来获取该字符串。如果这是错误的,则
Text
属性也将具有错误的值

好消息是
TextPart
具有允许您指定字符集覆盖的方法

我建议尝试:

var text = part.GetText (Encoding.UTF8);
看看这是否有效

FWIW,
iso-2022-jp
是一种编码,它将日文字符强制转换为7位ascii格式,看起来像是完整的jibberish。如果日文文本实际在
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
    }
}
var encodings=新列表();
字符串文本=空;
试一试{
var encoding=encoding.GetEncoding(part.ContentType.Charset,
新的EncoderExceptionFallback(),
新DecoderExceptionFallback());
编码。添加(编码);
}捕获(异常){
}捕获(不支持异常){
}
//添加utf-8作为我们的第一个后备方案
encodings.Add(Encoding.GetEncoding)(65001,
新的EncoderExceptionFallback(),
新DecoderExceptionFallback());
//添加iso-8859-1作为我们的最终后备方案
Add(Encoding.GetEncoding)(28591,
新的EncoderExceptionFallback(),
新DecoderExceptionFallback());
for(int i=0;i
谢谢。.eml文件是由第三方程序创建的,因此我将继续使用它们;听起来他们的app.FWIW有问题,我刚刚用一个可能的通用解决方案更新了我的答案。编辑非常。。。挑剔?我不介意,但如果我们要吹毛求疵,我们至少能让吹毛求疵保持一致吗?换句话说,MimeKit被编辑为
MimeKit
一次,但另一个实例保留了原始字体。另外,在一个实例中,.eml被挑剔为
.eml
,但在随后的实例中没有。谢谢