回答編集履歴

5

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

2017/06/18 03:05

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

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

4

不適切な訂正を削除

2017/06/18 03:04

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -28,19 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- 訂正:上記の説明間違いでした。大変失礼しました。
31
+ 訂正:(最初ここに書いた訂正内容訂正内容自体が不適切でしたので改めて訂正2に確認結果を記しました。
32
-
33
- 上記の方法は「JavacのエラーメッセージをUTF-8で表示する方法」でした。
34
-
35
- ソースコードのエンコーディングを指定するのは-encodingオプションの方でした。
36
-
37
-
38
-
39
- `javac -encoding UTF-8 Main.java`
40
-
41
-
42
-
43
- で実行するとどうでしょう?
44
32
 
45
33
 
46
34
 

3

訂正2

2017/06/18 02:11

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -41,3 +41,49 @@
41
41
 
42
42
 
43
43
  で実行するとどうでしょう?
44
+
45
+
46
+
47
+ ---
48
+
49
+
50
+
51
+ 訂正2: Windowsでのオプションとエラーメッセージ、標準出力、ソースコード上の文字解釈の文字化けの関係を改めて確認してみました
52
+
53
+ (Windows10 64bit)
54
+
55
+ chcpでcodepageを65001(=UTF-8)としてもjavac/javaいずれも明示的なオプションなしにはなんらかの文字化けが起きますので、javaのコンパイルや実行においてはcodepageを65001とすることに意味を感じません。デフォルトのcodepage 932のままのほうが分かり易いと思います。
56
+
57
+
58
+
59
+ ###コンパイル時(うまくいく組み合わせ)
60
+
61
+ |source|codepage(※1)|-encoding|-J-Dfile.encoding|
62
+
63
+ |:--|:--|:--|:--|
64
+
65
+ |UTF-8|65001|UTF-8|UTF-8|
66
+
67
+ |UTF-8|65001|なし|UTF-8|
68
+
69
+ |UTF-8|932|UTF-8|なし|
70
+
71
+ |UTF-8|932|UTF-8|MS932|
72
+
73
+
74
+
75
+ ###実行時(うまくいく組み合わせ)
76
+
77
+ |codepage(※1)|-Dfile.encoding|
78
+
79
+ |:--|:--|
80
+
81
+ |65001|UTF-8|
82
+
83
+ |932|なし|
84
+
85
+
86
+
87
+ ※1: コマンドプロンプトでchcpにより設定したcodepage
88
+
89
+

2

訂正

2017/06/17 16:23

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- `javac -encoding UTF_8 Main.java`
39
+ `javac -encoding UTF-8 Main.java`
40
40
 
41
41
 
42
42
 

1

訂正

2017/06/17 12:15

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -21,3 +21,23 @@
21
21
 
22
22
 
23
23
  `javac -J-Dfile.encoding=UTF_8 Main.java`
24
+
25
+
26
+
27
+ ---
28
+
29
+
30
+
31
+ 訂正:上記の説明は間違いでした。大変失礼しました。
32
+
33
+ 上記の方法は「JavacのエラーメッセージをUTF-8で表示する方法」でした。
34
+
35
+ ソースコードのエンコーディングを指定するのは-encodingオプションの方でした。
36
+
37
+
38
+
39
+ `javac -encoding UTF_8 Main.java`
40
+
41
+
42
+
43
+ で実行するとどうでしょう?