- PR -

JavaMail(機種依存文字 への対応)

1
投稿者投稿内容
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-02-24 17:31
こんにちは。
JavaMailでPOP機能を持ったアプリを作成しているのですが、
機種依存文字(まるいち、ギリシャ文字など)
が ? に化けてしまいます。
JavaMailに限らず、こういった問題はあるようですが、

String work = message.getContent().toString();
String msg = new String(work.getBytes("8859_1"), "Windows-31J");

としても、直りませんでした。
MS932など色々試してみたのですが。。。。
そこで一文字ずつ charAt()で抜いてきて、
16数に変換し、表示してみましたところ、

fffd となり、機種依存文字は全てこの fffd にまとめられているようでした。

個別のコードが判定できたら、無理やりswith文などで変換できるのですが、
皆様どのように対処しているのでしょうか。

ご教授おねがいします。。泣
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 2003-02-25 09:30
こんにちは。
私も以前、機種依存文字について悩んだことがあります。
ここにも、書き込みをさせていただきました。
私は、木下信さん著「JavaMail完全解説」を見て受信プログラムを作っていたのですが、
そのとき、ISO-2022-JPで送られてきたメール内の該当文字が化けていました。

subjectを取るとき、私は、javax.mail.internet.MimeMessage#getSubject()
を使っていたのですが、そのメソッドの中の javax.mail.internet.MimeUtility#decodeText(String)
が化ける原因でした。
この中では、privateなメソッドを呼んでいて、最後に new String(byte[], int, int, String)
をしているところがあって、ここで化けていました。
なので、subjectを取るときは、getHeaderメソッドで取得して、自分で文字コード変換しました。

本文は、テキストパート javax.mail.Part#getContent()の結果をStringでキャストして取得
していたのですが、同様の問題が発生したため、Partから文字コード変換される前のStream
オブジェクトを取得し、自分で文字コード変換して逃れました。。。

確か、添付ファイル名を取得するときも同じ問題に遭遇したと記憶しています。

少しでも参考になるとうれしいです。。。
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-02-25 09:34
レスありがとうございます!

getSubject()やgetContent()って
中で勝手にコード変換してますよね。。
だから、処理されない文字は ? でくくられてるんですね。

なるほど。。。。
なんとなくわかってきました。
貴重なヒントをありがとうございます!!
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-02-25 20:29
引用:

本文は、テキストパート javax.mail.Part#getContent()の結果をStringでキャストして取得
していたのですが、同様の問題が発生したため、Partから文字コード変換される前のStream
オブジェクトを取得し、自分で文字コード変換して逃れました。。。

確か、添付ファイル名を取得するときも同じ問題に遭遇したと記憶しています。

少しでも参考になるとうれしいです。。。


大変,役にやっています。
今テストプログラムの段階で
色々思考錯誤してみました。
ISO2022JPのJISコードがそのまま取得できたので
機種依存文字のユニークな値を拾うことができました。

機種依存文字以外のものはgetContent()メソッドを使って、
機種依存文字のものは上記のJISコードから相当する文字を
StringBufferにappendしています。

Javaの便利すぎるところが、
機種依存文字の場合、裏目にでてしまったモノですね。。。
本当にありがとうございました。

[ メッセージ編集済み 編集者: raystar 編集日時 2003-02-25 20:31 ]
MO
会議室デビュー日: 2005/08/21
投稿数: 2
投稿日時: 2005-08-23 03:51
私も今、この問題で悩んでいます。

こちらも同様、getContent()を本文で呼んでいて、
   protected MimeMessage msg;
Object content = msg.getContent();

if(content != null && content instanceof String) {
body = (String) content;
のようなことをし、サブジェクトは、
subject = javax.mail.internet.MimeUtility.decodeText(subject);

のようなことをしていて、それぞれ「まるいち」などが化けてしまいます。

引用
---------------------------------------------------
本文は、テキストパート javax.mail.Part#getContent()の結果をStringでキャストして取得していたのですが、同様の問題が発生したため、Partから文字コード変換される前のStream オブジェクトを取得し、自分で文字コード変換して逃れました。。。
---------------------------------------------------

raystarさん、latteさんの言っていることはわかるのですが、当方C++畑の人間で、Javaにはあまり詳しくないので、どなたかもう少し詳しく具体的なメソッド名なども含めて説明していただけると非常に助かります。例えば、自分でStream オブジェクトを取得するにはmsg.getInputStream()を使えばよいのでしょうか。やってみましたがうまくいきません。

どなたかご教授いただけると助かります。
未記入
常連さん
会議室デビュー日: 2005/02/23
投稿数: 20
投稿日時: 2005-08-23 13:39
JISコード未定義の範囲の文字を自分の望みどおりに結果として得るには自分でBASE64等をデコードし、文字化けするコードは別のコードに置き換えて結果の文字列を得るようにする方法しかありません。
MO
会議室デビュー日: 2005/08/21
投稿数: 2
投稿日時: 2005-08-25 00:51
返信、ありがとうございます。

Base64をデコードするときに、

引用
------------------------------
ISO2022JPのJISコードがそのまま取得できたので
機種依存文字のユニークな値を拾うことができました。
------------------------------------

の部分でつまづいています。具体的に「ISO2022JPのJISコード」を拾うにはどうしたらよいのでしょうか。

よろしくおねがいします。
1

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