teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

閲覧者が混乱を招きそうなので、記述を全面的に見直した

2017/06/18 03:05

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,38 +1,38 @@
1
- コマンドプロンプトとおしゃっているのでWindowsかと想像しま
1
+ ###前提が不明瞭な点・誤りが多々あたため、全面的に書きしました
2
2
 
3
+ 本内容はWindows10(64bit),コマンドプロンプトからのコンパイル,JDK1.8を前提として調べた結果に基づいています。
4
+
3
5
  > コマンドプロンプトの文字コードは、utf-8にしてあります。
4
6
 
5
- これはどのように設定されているのでしょう。自分にはここが怪しい気がします。
6
- Linuxすと環境変数`LANG`を`ja_JP.UTF-8`に設定するだけ簡単UTF-8にきます。(デフォルトでUTF-8なっていることが多いのでわざわざしなくてもという話もありますが)
7
+ chcp 65001utf-8に設定されていたとのことすが、後述のようWindowsコマンドプロンプトのcodepageの設定と、javac/javaの「システムのデフォルトエンコーディングの解釈」は今一つ整合性が取れていように見えたので、注意が必要だいます
7
8
 
8
- 一方WindowsではデフォルトエンコーディングをLinuxのように手軽に変更できないと思います。
9
+ Windowsのコマンドプロンプ上でMS932(つまりMicrosoftのShift-JIS)以外のエンコーディングのソースコンパイルする場合、例えば以下のようにする文字化けを防げると思います。
9
10
 
11
+ - コマンドプロンプトのcodepageはデフォルトのままとする(chcp 932とする)
10
- Windows上でMS932(つまりMicrosoftのShift-JIS)以外のエンコーディングのソースをコンパイルする場合、javacのオプションでエンコーディングを指定するとうまくいきます。
12
+ - javacの-encodingオプションでソースファイルのエンコーディングを指定する
13
+ ソースコードがUTF-8でしたら`javac -encoding UTF-8 Main.java`とします。
11
14
 
12
- `javac -J-Dfile.encoding=UTF_8 Main.java`
13
-
14
15
  ---
15
16
 
17
+ UTF-8のソースコードを前提として文字化けが起きないようなオプションの組み合わせがどうなっているのかを調べてみました。(Windows10, JDK1.8)
16
- 訂正:(最初ここに書た訂正内容訂正内容自体が不適切でしたので改めて訂正2に確認結果を記しました
18
+ ここう「文字化け」の対象「ソースコード上文字列」「javac/javaのエラーメッセージ」の2つ
17
19
 
18
- ---
19
-
20
- 訂正2: Windowsでのオプションとエラーメッセージ、標準出力、ソースコード上の文字解釈の文字化けの関係を改めて確認してみました
21
- (Windows10 64bit)
22
- chcpでcodepageを65001(=UTF-8)としてもjavac/javaいずれも明示的なオプションなしにはなんらかの文字化けが起きますので、javaのコンパイルや実行においてはcodepageを65001とすることに意味を感じません。デフォルトのcodepage 932のままのほうが分かり易いと思います。
23
-
24
- ###コンパイル時(うまくいく組み合わせ)
20
+ コンパイル時
25
21
  |source|codepage(※1)|-encoding|-J-Dfile.encoding|
26
22
  |:--|:--|:--|:--|
23
+ |UTF-8|932|UTF-8|なし|
24
+ |UTF-8|932|UTF-8|MS932|
27
25
  |UTF-8|65001|UTF-8|UTF-8|
28
26
  |UTF-8|65001|なし|UTF-8|
29
- |UTF-8|932|UTF-8|なし|
30
- |UTF-8|932|UTF-8|MS932|
31
27
 
32
- ###実行時(うまくいく組み合わせ)
28
+ 実行時
33
29
  |codepage(※1)|-Dfile.encoding|
34
30
  |:--|:--|
31
+ |932|なし|
35
32
  |65001|UTF-8|
36
- |932|なし|
37
33
 
38
34
  ※1: コマンドプロンプトでchcpにより設定したcodepage
35
+
36
+ 上記結果からの意見:
37
+ chcpでコマンドプロンプトのcodepageを65001(=UTF-8)としてもjavac/javaいずれも明示的なオプションなしには文字化けが起こるようです。特に混乱するのはcodepageがUTF-8となっていてもjava/javacのエラーメッセージはcodepageに沿ったエンコーディングでは出力されない点です。
38
+ その意味ではデフォルトのcodepage 932のままのほうが分かり易いと感じます。

4

不適切な訂正を削除

2017/06/18 03:04

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -13,14 +13,8 @@
13
13
 
14
14
  ---
15
15
 
16
- 訂正:上記の説明は間違いでした。大変失礼しました。
16
+ 訂正:(最初ここに書た訂正内容は訂正内容自体が不適切でしたので改めて訂正2に確認結果を記しました。
17
- 上記の方法は「JavacのエラーメッセージをUTF-8で表示する方法」でした。
18
- ソースコードのエンコーディングを指定するのは-encodingオプションの方でした。
19
17
 
20
- `javac -encoding UTF-8 Main.java`
21
-
22
- で実行するとどうでしょう?
23
-
24
18
  ---
25
19
 
26
20
  訂正2: Windowsでのオプションとエラーメッセージ、標準出力、ソースコード上の文字解釈の文字化けの関係を改めて確認してみました

3

訂正2

2017/06/18 02:11

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -19,4 +19,26 @@
19
19
 
20
20
  `javac -encoding UTF-8 Main.java`
21
21
 
22
- で実行するとどうでしょう?
22
+ で実行するとどうでしょう?
23
+
24
+ ---
25
+
26
+ 訂正2: Windowsでのオプションとエラーメッセージ、標準出力、ソースコード上の文字解釈の文字化けの関係を改めて確認してみました
27
+ (Windows10 64bit)
28
+ chcpでcodepageを65001(=UTF-8)としてもjavac/javaいずれも明示的なオプションなしにはなんらかの文字化けが起きますので、javaのコンパイルや実行においてはcodepageを65001とすることに意味を感じません。デフォルトのcodepage 932のままのほうが分かり易いと思います。
29
+
30
+ ###コンパイル時(うまくいく組み合わせ)
31
+ |source|codepage(※1)|-encoding|-J-Dfile.encoding|
32
+ |:--|:--|:--|:--|
33
+ |UTF-8|65001|UTF-8|UTF-8|
34
+ |UTF-8|65001|なし|UTF-8|
35
+ |UTF-8|932|UTF-8|なし|
36
+ |UTF-8|932|UTF-8|MS932|
37
+
38
+ ###実行時(うまくいく組み合わせ)
39
+ |codepage(※1)|-Dfile.encoding|
40
+ |:--|:--|
41
+ |65001|UTF-8|
42
+ |932|なし|
43
+
44
+ ※1: コマンドプロンプトでchcpにより設定したcodepage

2

訂正

2017/06/17 16:23

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -17,6 +17,6 @@
17
17
  上記の方法は「JavacのエラーメッセージをUTF-8で表示する方法」でした。
18
18
  ソースコードのエンコーディングを指定するのは-encodingオプションの方でした。
19
19
 
20
- `javac -encoding UTF_8 Main.java`
20
+ `javac -encoding UTF-8 Main.java`
21
21
 
22
22
  で実行するとどうでしょう?

1

訂正

2017/06/17 12:15

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -9,4 +9,14 @@
9
9
 
10
10
  Windows上でMS932(つまりMicrosoftのShift-JIS)以外のエンコーディングのソースをコンパイルする場合、javacのオプションでエンコーディングを指定するとうまくいきます。
11
11
 
12
- `javac -J-Dfile.encoding=UTF_8 Main.java`
12
+ `javac -J-Dfile.encoding=UTF_8 Main.java`
13
+
14
+ ---
15
+
16
+ 訂正:上記の説明は間違いでした。大変失礼しました。
17
+ 上記の方法は「JavacのエラーメッセージをUTF-8で表示する方法」でした。
18
+ ソースコードのエンコーディングを指定するのは-encodingオプションの方でした。
19
+
20
+ `javac -encoding UTF_8 Main.java`
21
+
22
+ で実行するとどうでしょう?