首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MimeKit字符编解码问题

MimeKit字符编解码问题
EN

Stack Overflow用户
提问于 2017-03-27 17:34:19
回答 1查看 2.9K关注 0票数 2

在使用MimeKit.eml文件转换为.msg文件时,我遇到了一个似乎与编码有关的问题。

例如,使用包含以下内容的EML文件:

代码语言:javascript
复制
--__NEXTPART_20160610_5EF5CF91_471687D
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

添付ファイル名テスト

结果是正文内容中的垃圾:

代码语言:javascript
复制
・Y・t・t・@・C・・・シ・e・X・g

此外,在读取ü文件时,基-64编码的??字符将显示为??。我已经下载了MimeKit的最新版本,但这似乎没有什么区别。

.eml文件与Outlook 2016一起正确打开,但使用MimeKit似乎无法正确读取和解码这些文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-27 18:27:26

上面的MIME片段有一些问题:

Content-Transfer-Encoding: 7bit显然不是真的,也不太可能是问题所在(因为这个原因,MimeKit忽略了7bit8bit的值)。

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

当您获得TextPart.Text值时,MimeKit通过使用在Content-Type头中指定的字符集转换原始流内容来获得该字符串。如果这是错误的,那么Text属性也会有错误的值。

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

我建议尝试:

代码语言:javascript
复制
var text = part.GetText (Encoding.UTF8);

看看能不能。

FWIW,iso-2022-jp是一种编码,它强制日语字符形成一个7位的ascii格式,看起来像完全的拼凑。如果是在iso-2022-jp中,这就是你的日语文本的样子。

代码语言:javascript
复制
BE:IU%U%!%$%kL>%F%9%H

所以我才知道这不是iso-2022-jp :)

更新:

最终,解决方案可能是这样的:

代码语言:javascript
复制
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
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43052939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档