質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

2338閲覧

JavaMailで環境依存文字が文字化け

HiroS

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2017/06/19 14:21

###前提・実現したいこと
JavaMailでWindows環境依存文字の文字化けを解消したいです。
代替文字に置き換える方法ではなく、①は①として送りたいと思っています。
・charsetはISO-2022-JPです。
・起動オプションでx-windows-iso2022jpに読み替える方法が今の開発では使用できません。
・メールの確認方法として、メーラーが環境整ってなくて使用できないので、
メールサーバーに送られたメールを落としてきて、
サクラエディタにてJIS→SJISに変換してメールの確認をしています。

###発生している問題・エラーメッセージ
JavaMailを使用してメールを送ろうとしていますが、①や㍻等のWindows環境依存文字が文字化けしています。
前提に記述したとおり、起動オプションに設定を追加する方法が取れませんので、
①等をJISコードにするメソッド(下記参照)を作ったのですが、ステップ数が多く、
今の開発の規約で200ステップに抑えるようにと言われているので今のままでは使えません。
ステップ数を抑えるや他に何かやり方がないでしょうか?
よろしくお願いします。

###該当のソースコード
引数で貰った文字列の中に①等の環境依存文字があったら、$B-! (B等JISコードに変換しています。
これでreturnした文字列をメール本文としてsetTextに渡して送信しています。
public String convert(String str){
if(str == null){
return null;
}
char[] ch = str.toCharArray();
char[] convert = new char[500];
int j = 0
for(int i = 0; i < ch.length; i++){
switch (ch[i]){
case ‘\u2460’: //①のUnicode
convert[j] = ‘\u001B’ //ESC
j++;
convert[j] = ‘\u0024’ //$
j++;
convert[j] = ‘\u0042’ //B
j++;
convert[j] = ‘\u002D’ //-
j++;
convert[j] = ‘\u0021’ //!
j++;
convert[j] = ‘\u001B’ //ESC
j++;
convert[j] = ‘\u0028’ //(
j++;
convert[j] = ‘\u0042’ //B
j++;
break;
case ‘\u2460’: //②のUnicode
convert[j] = ‘\u001B’ //ESC
j++;
convert[j] = ‘\u0024’ //$
j++;
convert[j] = ‘\u0042’ //B
j++;
convert[j] = ‘\u002D’ //-
j++;
convert[j] = ‘\u0022’ //"
j++;
convert[j] = ‘\u001B’ //ESC
j++;
convert[j] = ‘\u0028’ //(
j++;
convert[j] = ‘\u0042’ //B
j++;
break;
(略)環境依存文字分、①②と似たことを書いてます。
default:
convert[j] = ch[i];
j++;
break;
}
return String.valueOf(convert);
}

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

なぜこんなに無駄に行数長くしているのですか?Unicodeのところまとめて文字列リテラルにすればいいのに。
また、StringBuilderという便利なクラスがありまして…

java

1public String convert(String str){ 2 if(str == null){ 3 return null; 4 } 5 char[] ch = str.toCharArray(); 6 StringBuilder builder = new StringBuilder(); 7 for(int i = 0; i < ch.length; i++){ 8 switch (ch[i]){ 9 case '\u2460': //①のUnicode 10 builder.append("\u001B\u0024\u0042\u002D\u0021\u001B\u0028\u0042"); 11 continue; 12 case '\u2461': //②のUnicode 13 builder.append("\u001B\u0024\u0042\u002D\u0022\u001B\u0028\u0042"); 14 continue; 15 // 中略 16 default: 17 builder.append(ch[i]); 18 } 19 } 20 return builder.toString(); 21}

なお、丸数字からの変換規則はよくわかりませんが、5文字目が単純に順番に対応するだけなら、
まとめてこう書けそうな気がします。

java

1// 丸付き1~20までに対応するUnicode 2if (0x2460 <= ch[i] && ch[i] <= 0x2473) { 3 builder.append("\u001B\u0024\u0042\u002D").append((char)(0x21 + (ch[i] - 0x2460))).append("\u001B\u0028\u0042"); 4}

投稿2017/06/19 14:36

編集2017/06/19 15:04
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroS

2017/06/20 00:41 編集

回答ありがとうございます。 char型以外コードポイントをいれてもただの文字列として扱われると思っていたので、長くなっていました。 追記 解決できそうです。ありがとうございました。
swordone

2017/06/20 01:13

Unicodeエスケープはあらゆる解析に先立って解釈されるため、コード中の{を\u007Bと書くこともできます。
guest

0

HiroSさん、ご返信が遅くなり、
大変申し訳ありませんでした。

「$B-!(B」をサクラエディター上へコピペして、
「変換」>「文字コード変換」>「EMAIL(JIS→SJIS)コード変換」
を実行すると、正しく「①」へ変換されますが、メール上の当該環境依存文字
だけは、「$B-!(B」で化けてしまします。

charsetヘッダー変更の件につきましては、
1.「x-windows-iso2022jp」は、イントラ側が古い為、
本文・ヘッダー含めて化けてしまいました。
2.「iso-2022-jp」は、当該環境依存文字のみ化ける現象でした。
3.「shift_jis」は、本文・ヘッダー含めて化けてしまいました。

因みに、メーラーについては、
1.Net側側は、Thunderbird(自動判別の日本語)で、日本語(ISO-2022-JP)です。
2.Intra側は、Sylpheed(自動認識)です。

以上、宜しくお願い申し上げます。

投稿2018/12/17 05:05

Animalg7

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/12/17 05:59

ここは回答するところなので、質問するなら新たに質問を立てましょう。
guest

0

便乗質問で大変申し訳ありませんが、こちらも同じ内容で悩んでおりましたが、
環境等は、全て投稿された「HiroS」さんと同じで、ご回答頂きました「swordone」
さんの内容で、対応をしようと実施しました。
しかし、「①」が「$B-!(B」へ化けてしまい思うように「①」と表示出来ません。

「やりたい事」
JavaMailで環境依存文字(①から⑳まで)の
文字化けをしないでメール上に正しく表示させたい。

「IDE環境」
①.OS:Windows7
②.IDE:Eclipse(Ver.4.8)All In One
③.JDK:Eclipseバンドル版JDK10.0.1
④.MIAL:Apache commons-email(SimpleEmail)

public static void main(String[] args) { String _maruichi = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳"; char[] chars = _maruichi.toCharArray(); StringBuilder _sb = new StringBuilder(); for ( int i = 0; i < chars.length; i++ ) { // ①⇒1、②⇒2、③⇒3に変換 if ( 0x2460 <= chars[ i ] && chars[ i ] <= 0x2462 ) { _sb.append( "\u001B\u0024\u0042\u0023" ). append( ( char )( 0x31 + ( chars[ i ] - 0x2460 ) ) ). append( "\u001B\u0028\u0042" ); } else { _sb.append( chars[ i ] ); } } String out = _sb.toString(); System.out.println( out ); }

なぜなのかを教えて頂けませんでしょうか。

以上、宜しくお願い申し上げます。

投稿2018/12/14 08:31

Animalg7

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroS

2018/12/14 13:11

「①」を「$B-!(B」に変換するためのコードなので、もしかしたら、メーラーの環境に原因があるかもしれません。エンコードの設定を変えると正常に見えるかもしれません。 自前でjisコードに変換する無理やりな方法なので、charsetを変えれるようなら、charsetを変えたほうが良いと思います。
guest

0

メールを送信する対象にもよりますが、思い切ってcharsetをUTF-8にしてみるとか?
一昔前は、対応していないSMTPサーバーやメーラーが多かったので、
ISO-2022-JP 7bitが常識でしたけど、最近はけっこうUTF-8いけますよ。
GmailもUTF-8 base64 で送ってますし。
ただ、ガラケーとかだとしんどいかもしれません。。。

投稿2017/06/20 01:12

root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroS

2017/06/21 11:21 編集

返信が遅れてしまい申し訳ありません。回答ありがとうございます。 その案も真っ先に上げましたが、却下されてしまいました。。。 それで、あれこれと模索していました。 メールはISO-2022-JPで送るものっていうのを変えたくないのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問