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

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

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

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

Q&A

解決済

1回答

30814閲覧

javaでのコンパイルが文字化けします。

Jonetsu

総合スコア9

Java

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

0グッド

2クリップ

投稿2017/06/17 11:01

kykmh_542_oboyさん
2017/6/1719:29:33
javaに詳しい人に質問があります。

私は、最近javaの勉強をし始めたものです。

下記のコードを入力するとコンパイルで一部文字化けします。
コマンドプロンプトの文字コードは、utf-8にしてあります。
コード間違いというよりかは文字コードがおかしいとおもわれます。
使用しているテキストエディタはATOMです。ATOMもutf-8にしてあります。

どなたか原因がわかる方おしえてください

public class Main {
public static void main(String[]args){
String s1 = "スッキリJava";
String s2 = "Java";
String s3 = "java";
if(s2.equals(s3)) {
System.out.println("s2とs3は等しい");
}
if(s2.equalsIgnoreCase(s3)){
System.out.println("s2とs3はケースを区別しなければ等しい");
}
System.out.println("s1の長さは" + s1.length() + "です");
if(s1.isEmpty()){
System.out.println("s1は空文字です");
}
}
}

コマンドプロンプト結果

C:\java\m>javac Main.java
Main.java:3: G[: AGR[fBOMS932Ƀ}bvł܂
String s1 = "ス?キリJava";
^
Main.java:7: G[: AGR[fBOMS932Ƀ}bvł܂
System.out.println("s2とs3は等し?");
^
Main.java:10: G[: AGR[fBOMS932Ƀ}bvł܂
System.out.println("s2とs3はケースを区別しなければ等し?");
^
Main.java:12: G[: AGR[fBOMS932Ƀ}bvł܂
System.out.println("s1の長さ?" + s1.length() + "で?");
^
Main.java:12: G[: AGR[fBOMS932Ƀ}bvł܂
System.out.println("s1の長さ?" + s1.length() + "で?");
^
Main.java:14: G[: AGR[fBOMS932Ƀ}bvł܂
System.out.println("s1は空?字で?");
^
Main.java:14: G[: AGR[fBOMS932Ƀ}bvł܂
System.out.println("s1は空?字で?");
^
G[7

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

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

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

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

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

guest

回答1

0

ベストアンサー

###前提が不明瞭な点・誤りが多々あったため、全面的に書きなおしました。

本内容はWindows10(64bit),コマンドプロンプトからのコンパイル,JDK1.8を前提として調べた結果に基づいています。

コマンドプロンプトの文字コードは、utf-8にしてあります。

chcp 65001でutf-8に設定されていたとのことですが、後述のようにWindowsコマンドプロンプトでのcodepageの設定と、javac/javaの「システムのデフォルトエンコーディングの解釈」には今一つ整合性が取れていないように見えたので、注意が必要だと思います。

Windowsのコマンドプロンプト上でMS932(つまりMicrosoftのShift-JIS)以外のエンコーディングのソースをコンパイルする場合、例えば以下のようにすると文字化けを防げると思います。

  • コマンドプロンプトのcodepageはデフォルトのままとする(chcp 932とする)
  • javacの-encodingオプションでソースファイルのエンコーディングを指定する

ソースコードがUTF-8でしたらjavac -encoding UTF-8 Main.javaとします。


UTF-8のソースコードを前提として文字化けが起きないようなオプションの組み合わせがどうなっているのかを調べてみました。(Windows10, JDK1.8)
ここでいう「文字化け」の対象は「ソースコード上の文字列」「javac/javaのエラーメッセージ」の2つです。

コンパイル時

sourcecodepage(※1)-encoding-J-Dfile.encoding
UTF-8932UTF-8なし
UTF-8932UTF-8MS932
UTF-865001UTF-8UTF-8
UTF-865001なしUTF-8

実行時

codepage(※1)-Dfile.encoding
932なし
65001UTF-8

※1: コマンドプロンプトでchcpにより設定したcodepage

上記結果からの意見:
chcpでコマンドプロンプトのcodepageを65001(=UTF-8)としてもjavac/javaいずれも明示的なオプションなしには文字化けが起こるようです。特に混乱するのはcodepageがUTF-8となっていてもjava/javacのエラーメッセージはcodepageに沿ったエンコーディングでは出力されない点です。
その意味ではデフォルトのcodepage 932のままのほうが分かり易いと感じます。

投稿2017/06/17 11:25

編集2017/06/18 03:05
KSwordOfHaste

総合スコア18402

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

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

Jonetsu

2017/06/17 11:40

コマンドプロンプトで chcp 65001 コマンドを入力し、utf-8にしました。 教えていただいた javac -J-Dfile.encoding=UTF_8 Main.java を入力したのですが、結果は変わりませんでした。 私のやり方がおかしいのかな。
KSwordOfHaste

2017/06/17 12:04

おぉ・・・chcpでできるんですか! それはともかく、chcpの設定に関係なく-J-D...でUTF-8のソースをコンパイルできるはずなのですが・・・
KSwordOfHaste

2017/06/17 12:10 編集

しまった!多分間違えました。 失礼しました。回答を訂正します。
Jonetsu

2017/06/17 12:17

回答ありがとうございます。 下記実行しました C:\java\m>javac -encoding UTF_8 Main.java G[: T|[gĂȂGR[fBOł: UTF_8 G[1 しかし、結果は変わりませんでした。残念です
KSwordOfHaste

2017/06/17 12:20 編集

申し訳ないです。UTF-8 (アンダーバーではなくハイフン)にしてみてください。 Java内部のCharsetに指定するCharset名はUTF_8, UTF-8どちらでもOKなのですが、コマンドラインに指定するエンコーディングはUTF-8でないとだめなようです。
Jonetsu

2017/06/17 12:26

ハイフンにしたら、実行はできたみたいですが、 やっぱり、一部文字化けはかわりませんでした こんな感じです Active code page: 65001 C:\Users\mnggd>cd.. C:\Users>cd.. C:\>cd java C:\java>cd m C:\java\m>javac -encoding UTF-8 Main.java C:\java\m>javac main.java main.java:3: G[: ́̕AGR[fBOMS932Ƀ}bvł܂ String s1 = "ス?キリJava"; ^
KSwordOfHaste

2017/06/17 12:31

chcp 932にしてやってみたらどうでしょうか? chcp 932 javac -encoding UTF-8 Main.java
Jonetsu

2017/06/17 12:33

こんな感じなりました C:\java\m>javac main.java main.java:3: エラー: この文字は、エンコーディングMS932にマップできません String s1 = "繧ケ繝?繧ュ繝ェJava";
KSwordOfHaste

2017/06/17 12:48 編集

質問者さんのコードをコピペし、UTF-8でセーブした上で、cp932、javac -encoding UTF-8 Main.javaでコンパイルすると当方(Windows10 64bit)のコマンドプロンプトではコンパイルできました。 テキストの一部に不正文字があったりするのでしょうか・・・? もっと短いhello world的プログラムならコンパイルできる気がしますがどうでしょう?
KSwordOfHaste

2017/06/17 12:54

指摘しそこねました。 > C:\java\m>javac main.java > main.java:3: エラー: この文字は、エンコーディングMS932にマップできません > String s1 = "繧ケ繝?繧ュ繝ェJava"; cp932にしたうえで javac -encoding UTF-8 main.java としていただきたかったのです。2つ上のコメントでは-encoding UTF-8が抜けています。
Jonetsu

2017/06/17 13:01

私のpcも(Windows10 64bit)のコマンドプロンプトです。 試しに、下記を実行すると成功します。しかし、例えば、"スッキリ"と入力すると同じように「ッ」が?表示されます。ちなみに、「すっきり」だと成功します。 chcp 65001設定です。デフォルトでは、cp932ですが、それだと日本語はうまくいきませんね。 テキストエディタがが悪いんですかね。 Atomの日本語バージョンです public class Main { public static void main(String[] args) { System.out.println("hello"); } }
Jonetsu

2017/06/17 13:03

>cp932にしたうえで >javac -encoding UTF-8 main.java >としていただきたかったのです。2つ上のコメントでは-encoding UTF-8が抜けています。 すみません。コメントに載せなかっただけで、設定はしてあります。
KSwordOfHaste

2017/06/17 13:07

バイナリーエディターをお持ちなら「スッキリ」のバイト列を確認すればよりはっきりしますが・・・ 以下はlinux的環境(cygwin64: LANG=ja_JP.UTF-8)でのバイナリーダンプです。 $ echo $LANG ja_JP.UTF-8@cjknarrow $ echo 'スッキリ' | od -tx1 0000000 e3 82 b9 e3 83 83 e3 82 ad e3 83 aa 0a e3...aaまでが「スッキリ」のUTF-8表現ですが・・・ここまでしなくても普通はよいはずなのですが…
Jonetsu

2017/06/19 13:33

丁寧な回答ありがとうございます。 しかし、うまくいかないですね。
KSwordOfHaste

2017/06/19 21:59

javacを使う場合にからむ条件はcodepage, -encoding UTF-8, -J-Dfile.encoding=UTF-8およびソーステキストの内容そのものと考えているのですが他にも何かの条件が関係しているのか・・・ソースの16進ダンプを見てみたい気もします。Windowsだと標準状態では16進ダンプをするコマンドがないのでこうしたとき不便ですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問