2017-03-27 48 views
1

MimeKitを使用して.emlファイルを.msg個のファイルに変換しているうちに、エンコードに関連する問題が発生しています。例えば、以下を含むEMLファイルにMimeKit文字のエンコーディング/デコードの問題

--__NEXTPART_20160610_5EF5CF91_471687D 
Content-Type: text/plain; charset=iso-2022-jp 
Content-Transfer-Encoding: 7bit 

添付ファイル名テスト 

結果は、ボディ・コンテンツにごみである:

・Y・t・t・@・C・・・シ・e・X・g 

また、ベース64はü文字符号化は、として表示されています?? EMLファイルが読み取られるとき。私はMimeKitの最新リリースをダウンロードしましたが、違いはありません。

.emlファイルはOutlook 2016で正常に開きますが、MimeKitを使用してもファイルを適切に読み取ったりデコードしたりすることはできません。

+0

編集は非常に...ニッキーピック? 私は気にしませんが、私たちがニックピックに向かうことができるなら、少なくとも、ニックピッキングを一貫させることができますか? つまり、MimeKitはMimeKitに一度編集されましたが、別のインスタンスが元のフォントに残っていました。 また、。emlはあるインスタンスでは '.eml'にニック・ピックされましたが、後のインスタンスではそうではありませんでした。 ありがとうございます。 –

答えて

1

あなたの上記のMIMEスニペットを持ついくつかの問題があります:(それは(MimeKitはまさにこの理由のため7bit8bitの値を無視します)問題になりそうではありませんaltho

Content-Transfer-Encoding: 7bitは、明らかに真実ではありません。

しかし、最も重要なことは、(それがutf-8のように見える)charsetパラメータがiso-2022-jpですが、内容自体は非常に明確にiso-2022-jpではないという事実である。

あなたはを取得すると値の場合、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 
    } 
} 
+0

ありがとうございます。 .emlファイルはサードパーティのプログラムによって作成されたので、私はそれらにフォローアップします。アプリの問題のように聞こえる –

+0

FWIW、私はあなたの問題に対する可能な一般的な解決策で私の答えを更新しました。 – jstedfast