- PR -

受信メールの件名が文字化けで困っています(JavaMail)

投稿者投稿内容
もぐもぐ
会議室デビュー日: 2006/10/24
投稿数: 4
投稿日時: 2006-10-24 02:40
受信したメールの件名メールヘッダが

=?iso-2022-jp?B?(エンコードされた文字列)?=

の形式の時、このエンコードされた文字列内に
機種依存文字列(たとえば、@AB@AB など)
が含まれていた場合、
JavaMailのAPI「MimeUtility.decodeText()」
を使用してデコードを行うと、文字化けしてしまいます。

過去ログを探したのですが
具体的な、文字化け回避方法が見つかりませんでした。

本当に困っています・・・・・

サンプル的なソースコードやホームページを教えていただけると助かります。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-10-24 08:52
ISO-2022-JPのメールの件名(本文でも)機種依存文字を使う方が誤りです。文字コードをUTF-8(transfer-encodingはbase64)にしてもらえばいいのかもしれませんが・・

引用:

もぐもぐさんの書き込み (2006-10-24 02:40) より:
受信したメールの件名メールヘッダが

=?iso-2022-jp?B?(エンコードされた文字列)?=

の形式の時、このエンコードされた文字列内に
機種依存文字列(たとえば、@AB@AB など)
が含まれていた場合、
JavaMailのAPI「MimeUtility.decodeText()」
を使用してデコードを行うと、文字化けしてしまいます。


それはある意味正しい動作では?そもそも丸付き数字が入っているのにISO-2022-JPを書いているのは間違ってませんか>元メールの件名。

例えばphpのmb_convert_encoding関数での変換では、SJIS,EUC-JP,JISは丸付き数字でもOK(相互に変換可能)ですが、ISO-2022-JPに変換すると?に化けます(ISO-2022-JPはJISとは別物の動作になります)。

ちなみに普通のメーラだと化けないんですよね?(メーラは「何が何でも表示しよう」とするので相当に許容範囲が広いです)

#多分このあたりは「自前で書く」しかないと思いますが・・

[ メッセージ編集済み 編集者: shimix 編集日時 2006-10-24 08:59 ]
もぐもぐ
会議室デビュー日: 2006/10/24
投稿数: 4
投稿日時: 2006-10-24 09:17
そうなんですよ
自前でなんとか作成しようと思っていて

いくつか文字コード変換について調べていたら
入出力ストリーム(http://ash.jp/java/stream.htm)で
文字化けを解決できそうと思っています。
私の思い込みかもしれませんが・・・・

また
下記の過去書き込みにある
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3706&forum=12&6
の最後の投稿メッセージに

「ISO2022JPのJISコード」を拾うにはどうしたらよいのでしょうか。

という所で止まってしまっています。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-10-24 10:22
http://www.yks.ne.jp/~tsurucha/ChangeLog/cat_e4bb8ae697a5e381aejakarta.html

参考までに。
私は文字化けで悩むのが面倒なので、
commons-emailと上記サイトのクラスを改造して使っていますが、
おおむね文字化けが発生せず使えています。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-10-24 10:46
引用:

もぐもぐさんの書き込み (2006-10-24 09:17) より:
「ISO2022JPのJISコード」を拾うにはどうしたらよいのでしょうか。

という所で止まってしまっています。


MIME Bですから「base64でencodeされた部分」を抜き出して、base64のdecodeをすればいいと思います。最初の記事で「エンコードされた文字列」と書かれている部分だけを取り出して「base64のdecode」だけすればいいハズです。全体を渡してMIMEでdecodeをしようとすると文字コードが不正なので(ISO-2022-JPに存在しないコードがある)化けてしまいますが、中身は単純にJISだと思います(送信しているメーラの実装が多分そうでしょう)。

[ メッセージ編集済み 編集者: shimix 編集日時 2006-10-24 10:51 ]
もぐもぐ
会議室デビュー日: 2006/10/24
投稿数: 4
投稿日時: 2006-10-25 16:57
そもそもこれは、
Javaの世界で「ISO-2022-JP」へのキャラクタセットに
文字をデコードするというJavaの処理で
機種依存文字については対応されていない。

ということなのでしょうか?
機種依存文字を1文字1文字リテラル文字で
プログラム内に定数としてコーディングし、
メールデータ1文字1文字を、
機種依存文字がないか調べていく。

という方法しかないのでしょうか?

mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-10-25 18:31
某企業の中ですが、decodeTextを自前で実装してますねえ。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-10-25 23:17
引用:

もぐもぐさんの書き込み (2006-10-25 16:57) より:
そもそもこれは、
Javaの世界で「ISO-2022-JP」へのキャラクタセットに
文字をデコードするというJavaの処理で
機種依存文字については対応されていない。

ということなのでしょうか?
機種依存文字を1文字1文字リテラル文字で
プログラム内に定数としてコーディングし、
メールデータ1文字1文字を、
機種依存文字がないか調べていく。

という方法しかないのでしょうか?



そう思っていいです。ISO-2022-JPにはそういう文字は「存在しない」ですから。前述したphpの変換なども「余計なことを」などと思ってしまいますが(汗)。

普通のメーラは正確にはISO-2022-JPでなくJISで送りますね。メール本文なども実際はそうしているハズです(で、キチンと?になっているとバグと言われる)。このあたりが「理想と現実」でしょうか(添付ファイル名のMIMEなどもそうですね。本来はRFC2231であるべきですが)。

mioさんが書かれたように「業務上何とかしないといけない」場合には自前で処理するしかないでしょう。

(追記)
「1文字1文字を、機種依存文字がないか調べていく。」というようなことはしなくてもJISだと思って処理すればいいのでは?JIS→SJISすればちゃんと戻せる状態になっているハズです。

[ メッセージ編集済み 編集者: shimix 編集日時 2006-10-25 23:22 ]

スキルアップ/キャリアアップ(JOB@IT)