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
,但在随后的实例中没有。谢谢