The project of U-WA-
http://uwa.potetihouse.com/
トップページ > 過去ログ > 記事閲覧
アイコン 【TKMP】base64を受信すると文字バケする
日時: 2009/07/09 11:11
名前: zeruda

データがbase64のメールを受信していますが、Time,Fromは文字化けなく表示されるのですが、Subjectが文字化けしてしまいます。あと、本文も文字化けします。
EncodeCharsetしても結果は変わりませんでした。
データがbase64では正しく文字を読みだすことはできないのでしょうか?

Page: 1 |

ファイル Re: 【TKMP】base64を受信すると文字バケする ( No.1 )
日時: 2009/07/09 12:45
名前: Toki◆pRU.c9X.EOI

>データがbase64のメールを受信していますが、Time,Fromは文字化けなく表示されるのですが、Subjectが文字化けしてしまいます。あと、本文も文字化けします。
文字化けとはどのような状態ですか?デコードに失敗していますか?文字コードが間違っていますか?

>EncodeCharsetしても
どのようなことを行いましたか?

>データがbase64では正しく文字を読みだすことはできないのでしょうか?
通常Subjectはbase64でエンコードされますし、添付ファイルもbase64でコンコードされます。
他に不具合報告は無いので、その点は問題ないと思われます。
ファイル Re: 【TKMP】base64を受信すると文字バケする ( No.2 )
日時: 2009/11/08 17:18
名前: 横からすみません

今回の件に直接関係はないかもしれませんが・・・
そういうのはほぼ迷惑メールなので相手をしないほうがよいと思います。

私が扱った迷惑メールの中には
下記サブジェクトのRFC違反のメールが来たことがあります。

「Subject: =?ISO-2022-JP?B?lZeRrY/sgvCU3o+XgsmCt4LpgrGCxoLNgsaCxILgg0qDk4Neg5N3?=」

デコード後のデコード後の実際の文字コードが
シフトJISなのにISO-2022-JPを名乗るメールで、この場合は文字化けします。

こんな感じで対応しました。

//メールデータが格納されたストリームからヘッダーのエントリを一覧で表示する
public void ShowHeaderData(System.IO.Stream MailStream)
{
//メールデータの解析クラスを作成します
TKMP.Reader.MailReader reader = new TKMP.Reader.MailReader(MailStream , true);

foreach(TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection)
{
//ヘッダの名称を取得
string name = headerdata.Name;
//ヘッダのデータを取得
string data = headerdata.Data;

Regex re = new Regex(@"(=\?.*\?=)", RegexOptions.IgnoreCase);
Match m = re.Match(headerdata.SourceData);
if (m.Success)
{
// サブジェクトなどでエンコードの指定と実際の文字列のエンコードが違う場合の対応
byte[] byteArray = Encoding.ASCII.GetBytes(headerdata.SourceData);
System.Text.Encoding enc = DetectEncoding(byteArray);
string decodestring = Regex.Replace(
enc.GetString(byteArray), @"(=\?.*\?=)",
new MatchEvaluator(DecodeHeaderB64));
data = decodestring;
}

System.Console.WriteLine(name + " : " + data);
}
}

※ DecodeHeaderB64 は
 「=?ISO-2022-JP?B?〜〜〜?=」をデコードして
 「ISO-2022-JP」の指定を無視して独自判断して
 デコードした「〜〜〜」の文字コードで文字列化するメソッドです。

 このメソッドを作れるくらいRFCを理解するのはすこし大変かもしれませんが、
 そうしないと作者も対応できないかと思います。


他にもサブジェクトに8bit目が立った文字が入っている
RFC違反のメールが文字化けしてます。

個人的には
TKMP.Reader.Header.HeaderString に string SourceData に加えて
byte [] SourceByteData メンバーが欲しいです。

※文字コード関連のいやらしいところをstring型にしてくれる
 素人でも簡単に扱える非常にありがたいライブラリだと思います。
 ただ、私は相手にしている迷惑メールが
 「=?GB2312?B??=」などの中国の漢字コードなので独自処理が必要・・

--
別件ですが
バウンダリーが「--」だけの迷惑メール

boundary="--"

が正しく処理できないような・・?
私は置換して「--XXX」扱いにして処理してます。

Page: 1 |