Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Javaで絵文字を送る方法

JavaでSoftbank携帯に絵文字を送る方法について、質問させてください。



現在、JavaMailで、メールの送受信について、勉強しています。


http://ponk.jp/?p=2177
上記のサイトを参考にさせていただき、絵文字の送信を行っています。


下記が、私が関係あると判断したMimeMessageクラスのソースを抜粋したものです。

to・suvjectの設定
-----

String text = "本文サンプル ";
String code0 = "太陽 " +String.valueOf((char)Integer.parseInt("E04A", 16));
String code1 = " 雲 " +String.valueOf((char)Integer.parseInt("E049", 16));
String code2 = " 雨 " +String.valueOf((char)Integer.parseInt("E04B", 16));
text = text + code0 + code1 + code2;
// iso-2022-jp から UTF-8 に変換
byte[] byte_sjis = text.getBytes("iso-2022-jp");
String str_uni = new String(byte_sjis,"UTF-8");
mimeMessage.setText (str_uni + "\n"); 

------
Transport.send する


単純に本文をutf-8にして送信しただけでは、
何も表示されず、インターネットを探しても、
このことに関する情報が引っかからなかった為、
途方にくれています。
端末は、922SHで動作テストをしています。
機種依存なども不明です。


ご指摘でもかまいません。
アドバイスをお願いします。

10

回答

7564

閲覧

10件の回答

評価

0

サイトにあったzipファイルに含まれているTestMain.javaと、本文の記述方法が異なるような気がしますが…
サイトで公開されているクラスを使用するわけではないのでしょうか?

あと、Stringは上書きしないものだって先日先輩に教えてもらいました。
後から書き換えたい文字列の場合には、StringBufferを使うそうですよ。
参考にして頂ければ幸いです。

評価

0

> 後から書き換えたい文字列の場合には、
> StringBufferを使うそうですよ。

余程、呼び出し回数が多いとか性能に気を使う箇所でなければ String で十分… というか String のほうが速いことも多いですから。

たとえば、文字列リテラルの連結なんかはコンパイル時に、連結済みに最適化されるし、文字列リテラルでなくても StringBuilder を使うコードに変換されたりします。

StringBuffer で明示的に書いちゃうと最適化の恩恵を受けにくくなるので注意。あと、メソッドに final 付けると速くなるとか、import に * 使うと遅くなるとかいう与太もありますね。

評価

0

>byte[] byte_sjis = text.getBytes("iso-2022-jp");
>String str_uni = new String(byte_sjis,"UTF-8");
>mimeMessage.setText (str_uni + "\n"); 
なんでUTF-8を挟んでるんだろう…。
setText(text, "iso-2022-jp")でいいと思うんだけど。



>あと、Stringは上書きしないものだって先日先輩に教えてもらいました。
上書きしてもかまわないんだけどな…。
意図を受け取れなかっただけで、実は値を変更できないことを言いたかったのかも知れない。


StringBufferは基本的に昔の話で、今は.NETから逆輸入されたStringBuilderを使うようになっている。
厳密には仕様が違うので使い分ける必要があるが、ほとんどの局面においてStringBuilderで問題がないことしかやっていない。

で、StringBuilderと単なる足し算とどちらを使うかは、足し算が一行で終わるものかどうかを基準にすればいい。
一行の足し算をループするならStringBuilderを明示的に使う。

評価

0

むしろ私が勉強になってますφ(。。)
StringBuilderの方が良いんですね…StringBufferと変わらないから、StringBufferの方を使えって言われたのですが
今時のJava事情からはちょっとずれていたのかもです。
今見たらAPIにも書いてありましたね…これからはStringBuilder使うようにします。

>>あと、Stringは上書きしないものだって先日先輩に教えてもらいました。
>上書きしてもかまわないんだけどな…。
プログラムとして問題なく動くことは分かっていますが、
$さんの言う通り、値を変更出来ないからStringを使用しないこと、という指示でした。
書いたコードが裏でどういう動きをしているのかは、まだまだ勉強が必要です;;

>>String str_uni = new String(byte_sjis,"UTF-8");
>>mimeMessage.setText (str_uni + "\n"); 
>なんでUTF-8を挟んでるんだろう…。
>setText(text, "iso-2022-jp")でいいと思うんだけど。
これはたぶん、「Docomoとau以外はUTF-8で送ればうまく行く気がします。」という取説の記述によるものだと思います。

評価

0

変数にはそれぞれ意味があるはずだから、Stringに限らず使い回しをしないほうが、本来は良いね。
使い回すことで少しでもロジックがぼやけてしまうようなら、使い回さないほうがいい。
大抵はリソースの使用量も大して変わらないし。

>「Docomoとau以外はUTF-8で送ればうまく行く気がします。」
なるほど、そういうことか。

であればsetText(text, "utf-8")じゃないのかなあ…。



ああ、忘れてた。

>import に * 使うと遅くなる
これはコンパイル時の違いだから、どうでもいい。

評価

0

連絡が遅くなりました。申し訳ないです。

>サイトにあったzipファイルに含まれている>TestMain.javaと、本文の記述方法が異なるような気が>しますが…
>サイトで公開されているクラスを使用するわけではない>のでしょうか?

掲示板に載せたソースは、サイトのソースを使用しても、
上手くいかなった為、思考錯誤して、
改変したものです。
全く同じソースではないです。


>>byte[] byte_sjis = text.getBytes("iso-2022-jp");
>>String str_uni = new String(byte_sjis,"UTF-8");
>>mimeMessage.setText (str_uni + "\n"); 
>なんでUTF-8を挟んでるんだろう…。
>setText(text, "iso-2022-jp")でいいと思うんだけど。

iso-2022-jp だと、テキストとしてそのまま認識されてしまうみたいです。
ですので、16進(に直した?)文字がそのまま表示されます。


現在、メーラーから送信して絵文字表示が出来た
メールを解析してみています。

Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

とあり、ユニコードでの8bitエンコーディングデータで送られているようです。

評価

0

Javaの文字列がUTF-16だってのは分かってるかな。
ソースコードが書いてあるファイルのエンコードには関係なく。

評価

0

それと、ソースはなるべく

・そのまま実行できる
・問題を再現できるコードが含まれている
・問題と関係ない部分を切り捨てた最低限の量

で書き込むようにしよう。

評価

0

答えじゃないけど。

>String code0 = "太陽 " +String.valueOf((char)Integer.parseInt("E04A", 16));

これは

String code0 = "太陽 " +(char)0xE04A;

でいいよ。

評価

0

自己解決しました。

ヘッダに以下のものを設定しなければいけないようです。
ヘッダを指定すれば、
最初に挙げたサイトのライブラリでも絵文字の表示が行われました。
>Content-Type: text/plain; charset=UTF-8; format=flowed
>Content-Transfer-Encoding: 8bit


調査したところ、下記のサイトで技術資料が公開されていました。
http://creation.mb.softbank.jp/doc_tool/doc_list.html
ドキュメント名 : HTML編
ページ : 39ページ

UTF-8での絵文字について書かれています。

回答してくださった皆様、ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。