【TKMP】base64を受信すると文字バケする |
- 日時: 2009/07/09 11:11
- 名前: zeruda
- データがbase64のメールを受信していますが、Time,Fromは文字化けなく表示されるのですが、Subjectが文字化けしてしまいます。あと、本文も文字化けします。
EncodeCharsetしても結果は変わりませんでした。 データがbase64では正しく文字を読みだすことはできないのでしょうか?
|
|
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」扱いにして処理してます。
|
|
|