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

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

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

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

Q&A

解決済

4回答

4854閲覧

javaコードを実行すると文字化してしまいます

newyee

総合スコア213

Java

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

0グッド

2クリップ

投稿2018/05/11 09:18

javaを勉強中のものです。
以下のコードをコマンドプロンプトで実行してみたのですが、文字化け?してしまい、エラーになってしまいます。
文字化けしてしまっている部分は、「㎠」の部分です。
テキストエディッタはsublimeTextを使用していまして、実行時には、javac -encoding UTF-8 とファイル名の前につけ加えていまして、他の日本語に関しましては、文字化けなどしていないのですが「㎠」の部分だけ文字化けしてしまっています...
対処法などありましたら、教えて下さい。
よろしくお願いします。

java

1public class calc { 2 public static double calcTriangleArea(double bottom, double height){ 3 4 5 6 double ans = bottom * height / 2.0; 7 8 return ans; 9 } 10 11 public static double calcCircleArea(double radius){ 12 13 14 15 double ans = radius * radius * 3.14; 16 17 return ans; 18 } 19 20 public static void main(String[] args){ 21 22 23 24 double triangleArea = calcTriangleArea(5.0, 3.11); 25 double circleArea = calcCircleArea(3.77); 26 27 System.out.println("三角形の面積は" + triangleArea + "㎠" ); 28 System.out.println("円の面積は" + circleArea + "㎠"); 29 30 } 31} 32

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/11 11:01

java -Dfile.encoding=UTF-8 JavaFQCN でやったらどうじゃろ?
退会済みユーザー

退会済みユーザー

2018/05/11 13:21

掲示板という文字も同時に出力したらどうなる?
newyee

2018/05/12 07:10

ダメでした...javac -encoding UTF-8 calc.javaとコンパイルしたのち、「java -Dfile.encoding=UTF-8 JavaFQCN 」とやってみたのですが、やはり「㎠」の部分が「?」になってしまいます。
newyee

2018/05/12 07:12

あ、すみません。「FQCN」の部分はクラスが見つからないとでましたので、ご質問させて頂いたコードのファイル名、「calc」を入力しました。
退会済みユーザー

退会済みユーザー

2018/05/12 07:46

FQCN :完全限定クラス名 .. パッケージ名+クラス名のこと
guest

回答4

0

  • フォント
    MS ゴシック

  • コードページ
    65001 (UTF8)

  • コンパイル:

javac -encoding UTF-8 Square.javac
  • 実行
java -Dfile.encoding=UTF-8 Square 1 2
  • コード
public class Square { public static void main(String[] args) { if (args.length != 2) { usage(); System.exit(1); } try { int x = Integer.valueOf(args[0]); int y = Integer.valueOf(args[1]); System.out.printf("%d x %d = %d ㎠", x, y, x * y); } catch (NumberFormatException e) { usage(); System.exit(1); } } protected static void usage() { System.err.println("Usage: Square x y"); System.err.println("x : number"); System.err.println("y : number"); } }
  • 結果

イメージ説明

フォントの誤りでしょうね
久々10年ぶりぐらいに cmd.exe 出力する java を実行したが CHCPはいるのか(わすれてたな)

投稿2018/05/12 01:58

編集2018/05/12 02:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/05/12 02:01

ぼけかまして立方米でやってたな(まあ同じか)
退会済みユーザー

退会済みユーザー

2018/05/12 02:05

※ ラスターフォントでは ㎠や㎤はないようです
guest

0

ベストアンサー

問題はという文字にあるようです。

この文字はユニコードでいうとU+33A0ですがWindows-31Jに対応する文字が存在しないようです。それゆえWindows-31Jでコンソール入出力をする限りはどうしようもありません。

Windows-31JあるいはShiftJIS系の文字コード全般に言えることですが「計算機で使える全ての文字は表せません」ごくごく一部しか表現できないのです。こうした不便を解消するためにこそUNICODEがあるわけです。

さてWindows上でJava(系のコマンド)をUTF-8などで動かすための配慮ですが

  • cmd.exe or powershellならchcp 65001とする

WSL, GitBashなどのソフト, cygwin等々では設定方法が違いますが省略します。

  • Javaへ「入出力のデフォルトをUTF-8にせよ」と明示する

コマンドラインオプションでjava -Dfile.encoding=UTF-8 calcとすればよいです。ただ
javacだとこれが -J-Dfile.encoding=UTF-8とかになって面倒なことこの上ないですね・・・

自分はコマンドラインオプションがめんどくさすぎるので違う方法を使うようになりました。

  • 環境変数JAVA_TOOL_OPTIONS

cmd.exe上ならset JAVA_TOOL_OPTIONS=-Dfile.encoding=utf8としておきます。
コントロールパネルの環境設定で設定してしまった方がいいでしょう。

JAVA_TOOL_OPTIONSはjavac, java, jarだけでなく全てのjdk/jre提供コマンドで有効な設定です。ただしコマンドを実行する度に
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=utf8
というメッセージが出てしまう点、悲しいものがあります。それでも、オプションを一々指定することに比べればましではないでしょうか?


訂正:間違って関係ないコメントを追記してしまいました。大変失礼しました。

投稿2018/05/11 11:44

編集2018/05/12 09:45
KSwordOfHaste

総合スコア18402

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

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

退会済みユーザー

退会済みユーザー

2018/05/11 12:47

chcp 65001 として java -Dfile.encoding=UTF-8 calc を実行しても ㎠ だけ文字化けします。環境は Windows10 の cmd.exe です。
KSwordOfHaste

2018/05/11 12:56 編集

chcp 65001の状態でtype calc.javaとしたら㎠は文字化けせずに表示されますか?もし文字化けしてないなら再度以下のとおりにやってみたらどうなりますか? javac -J-Dfile.encoding=utf8 calc.java java -Dfile.encoding=utf8 calc
退会済みユーザー

退会済みユーザー

2018/05/11 13:07

type calc.java -> ㎠ だけ文字化けします。 リコンパイル・実行 -> ㎠ だけ文字化けします。
KSwordOfHaste

2018/05/11 13:12

えーと・・・ソースファイル自体が文字化けしているので正しくコンパイルすること自体ができてません。 まずソースファイルの文字化け自体を解消してください。 sublimeTextでもメモ帳でもutf-8の編集やセーブは行えると思います。
退会済みユーザー

退会済みユーザー

2018/05/11 13:18

エディタ(Eclipse, メモ帳, Vim)で見る限り文字化けはしていません。 java -Dfile.encoding=utf8 calc > a.txt として a.txt をエディタで開くと文字化けはありません。
KSwordOfHaste

2018/05/11 13:30

これは不思議です。自分もWindows10 64bitですがcmd.exeで上のソースを実行するとchcp 65001をしておけば文字化けせずに㎠が出ます。 しつこいようですが、「type calc.java -> ㎠ だけ文字化けします。」これはchcp 65001した状態で㎠だけ化けるということですよね?
退会済みユーザー

退会済みユーザー

2018/05/11 13:38

すみません。コマンドプロンプトのフォントを変更したら文字化けしないようになりました。
KSwordOfHaste

2018/05/11 13:55 編集

あらら。変えてたんですか。予想外です。 それはともかく解決してなによりです。 --- もしよかったら「何のフォントを設定していたから」文字化けしていたのか教えてください。
退会済みユーザー

退会済みユーザー

2018/05/11 19:56

「MigMix 1M」です。Eclipse ではエディタとコンソールをこのフォントにしていて何の問題も起きていません。ConEmuというコンソールでも使っていますがchcp 65001なら文字化けしません。cmd.exeだけ文字化けします。
KSwordOfHaste

2018/05/12 01:39 編集

情報ありがとうございます。なるほど文字化けしますね。いくつかのものでやってみました cmd.exe => NG powershell => NG Windows Subsystem for Linux => NG cygwin(64bit) => OK MinGW(64bit) => OK 自分は普段cygwinでConsolasを使ってますがConsolasだとcmd.exe/powershellでは日本語自体が表示できなくなりました。 おそらく複合フォントはcmd.exe/powershellでは対応してなくて、ComEnu/cygwin/mingwのコンソール、Sublimetext/Atomの端末プラグインのようなものならサポートしているということではないかと思いました。 cmd.exe/powershellでは無難にMSゴシックにし、それ以外の環境でMigMixを利用するのがとりあえずの対応になるのではないでしょうか?
newyee

2018/05/12 07:17

ご回答ありがとうございます。 勉強不足で、申し訳ないのですが、ご回答下さったこちらの部分「cmd.exeでchcp 65001とする。」なのですが、コマンドプロンプロトのどの部分でchcp 65001とすれば良いのでしょうか...?
KSwordOfHaste

2018/05/12 07:36 編集

コマンドプロンプトを起動してから chcp 65001 というコマンドを打ち込むということです。その意味はcmd.exeが使用しているコンソール画面でテキストの入出力をutf-8で行うように文字セットを変更するという意味です。
newyee

2018/05/12 08:46

文字化け解消されました! ありがとうございます。すみません。まだプログラミングなどの勉強始めたばかりでして、理解できない部分があり申し訳ないのですが、文字化けの原因と致しましては、 sublime textで書いたソースコードの文字コードに「㎠」が存在していなかったため、コマンドプロンプトの方で、「㎠」が存在する文字コード、「utf-8」に変換をし、実行した。←このような理解で合っていますでしょうか...?
KSwordOfHaste

2018/05/12 09:52 編集

表現をはしょりすぎていて「正しい」とは言い難いです。 ・ソースコード:UTF-8として「㎠」が存在 ・javac -encoding utf-8でコンパイル=>「㎠」は正しくクラスファイルへ反映される ここまでは問題なし。ここからが問題。 ・cmd.exeでchcp 65001をせずにjava calcと実行 =>javaは標準出力へ文字セットWindows-31Jへ変換する。しかし「㎠」はWindows-31Jには存在しない文字なので変換不能という意味で'?'というWindows-31Jの文字(クェスチョンマーク)へ変換した。cmd.exeはJavaから'?'というWindows-31Jの文字を受け取ったのでそのまんま'?'と画面に表示した。これが文字化けに見えた。 最初発生していた問題の原因は正確にはこのように理解すべきと思います。
newyee

2018/05/13 08:03

ご丁寧に教えて下さりありがとうございました。 おかげでなんとか理解することができました。 ご回答下さった部分で勉強不足が故、知らない単語など多々ありましたので、javaの勉強にもっと励んで参りたいと思います。
guest

0

#################

投稿2018/05/11 09:54

編集2018/05/11 09:55
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

コマンドプロンプトであれば

chcp 65001

としてから実行してください。

コマンドプロンプトはUTF-8ではありません。

chcpは不要です。訂正します。
文字化けは解消していません。

投稿2018/05/11 09:27

編集2018/05/11 11:32
webarata3

総合スコア367

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

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

退会済みユーザー

退会済みユーザー

2018/05/11 10:17

私の環境(Windows10)でも質問と同じ現象が再現しました。chcp 65001 としてから実行するとすべての漢字が文字化けします。
webarata3

2018/05/11 10:44

あー文字化けしますね、確認不足でした。ちょっと確認しますね。
webarata3

2018/05/11 10:50

確認のため、 javac -encoding UTF-8 でコンパイルしたclassファイルをmacに持っていって実行(java calc)してみましたが文字化けしませんでした。ですのでコンパイルの仕方は問題なくて、問題は別のところにありそうです。
退会済みユーザー

退会済みユーザー

2018/05/11 11:02

chcp 65001 とした状態で java -Dfile.encoding=utf-8 calc を実行すると㎠だけ文字化けしますが、出力をファイルにリダイレクトすると、正しいUTF-8ファイルができています。
退会済みユーザー

退会済みユーザー

2018/05/12 01:59 編集

誤:多分 CHCP は不要じゃね
webarata3

2018/05/11 11:30

chcpはふようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問