【bash】 シェルからjavaを呼ぶ ①実行編では、
単純にシェルからjavaを呼んで、プロンプト表示させただけなので、
文字コードについて意識することはなかったと思いますが、
以下の様に、シェルとjavaで共通したファイルを使用することにより、
文字コードの問題にぶつかります。
まずはjavaファイル。これは①実行編と一緒です。
Test.javaの中身-----------------------------------------
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Javaファイルを実行!");
}
}
--------------------------------------------------------
シェルのファイル。ここでちょっと細工します。
Test.shの中身-------------------------------------------
#!/bin/sh
LOG_FILE=/test/log/test.log ←①ログファイルの場所とファイル名を設定
echo "Test.sh開始" > $LOG_FILE ←②シェルログをログファイルに出力
java Test >> $LOG_FILE ←③javaを実行、出力内容をログファイルに出力
echo "Test.sh終了" >> $LOG_FILE ←④シェルログをログファイルに出力
--------------------------------------------------------
実行するコマンドを叩く
$ sh Test.sh
出力されたログファイルを確認します。
test.logの中身------------------------------------------
Test.sh開始
Java繝輔ぃ繧、繝ォ繧貞ョ溯。鯉シ・
Test.sh終了
--------------------------------------------------------
③ではいたJavaファイルの出力の部分が文字化けしています。
これは、シェルとログファイルがShift-JIS形式で、
JavaファイルがUTF-8形式であるために起こっているのです。
シェルは、Windows上でメモ帳か何かで作成してLinuxサーバに上げて実行すると、
特に文字化けせずに動作するので、Shift-JISになっていることが多いのです。
また、Shift-JISのシェルでログファイルを作成しているので(②の所)
ログファイルもShift-JISになる。
そしてJavaファイルは、Eclipceやメモ帳などで作成しLinuxサーバに上げても、
UTF-8でないとコンパイルできないので、ファイルをUTF-8に変換するかUTF-8でコンパイルし実行する。
結果、Shift-JISのログファイルにUTF-8のjavaのログが出力されるので、
上記の様な文字化けがおこる。
解決策は簡単。
シェルをUTF-8で保存、サーバに上げること。
そうすればシェルがUTF-8になる→ログもUTF-8になる。
→javaもUTF-8→みんなUTF-8になる。
以上。
ちなみに結果は以下の通り
test.logの中身------------------------------------------
Test.sh開始
Javaファイルを実行!
Test.sh終了
--------------------------------------------------------
余談ですが、シェルをShift-JISのまま実行させたい場合には、Javaファイルの出力をShift-JISにしてあげればよい。
つまり、合わせることが重要。
Javaファイルの出力をShift-JISにするのは、FileInputStreamクラスを使用して、
出力時の文字コード指定をする。
(やり方は書きません。UTF-8に合わせればよいと思っているので。)
単純にシェルからjavaを呼んで、プロンプト表示させただけなので、
文字コードについて意識することはなかったと思いますが、
以下の様に、シェルとjavaで共通したファイルを使用することにより、
文字コードの問題にぶつかります。
まずはjavaファイル。これは①実行編と一緒です。
Test.javaの中身-----------------------------------------
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Javaファイルを実行!");
}
}
--------------------------------------------------------
シェルのファイル。ここでちょっと細工します。
Test.shの中身-------------------------------------------
#!/bin/sh
LOG_FILE=/test/log/test.log ←①ログファイルの場所とファイル名を設定
echo "Test.sh開始" > $LOG_FILE ←②シェルログをログファイルに出力
java Test >> $LOG_FILE ←③javaを実行、出力内容をログファイルに出力
echo "Test.sh終了" >> $LOG_FILE ←④シェルログをログファイルに出力
--------------------------------------------------------
実行するコマンドを叩く
$ sh Test.sh
出力されたログファイルを確認します。
test.logの中身------------------------------------------
Test.sh開始
Java繝輔ぃ繧、繝ォ繧貞ョ溯。鯉シ・
Test.sh終了
--------------------------------------------------------
③ではいたJavaファイルの出力の部分が文字化けしています。
これは、シェルとログファイルがShift-JIS形式で、
JavaファイルがUTF-8形式であるために起こっているのです。
シェルは、Windows上でメモ帳か何かで作成してLinuxサーバに上げて実行すると、
特に文字化けせずに動作するので、Shift-JISになっていることが多いのです。
また、Shift-JISのシェルでログファイルを作成しているので(②の所)
ログファイルもShift-JISになる。
そしてJavaファイルは、Eclipceやメモ帳などで作成しLinuxサーバに上げても、
UTF-8でないとコンパイルできないので、ファイルをUTF-8に変換するかUTF-8でコンパイルし実行する。
結果、Shift-JISのログファイルにUTF-8のjavaのログが出力されるので、
上記の様な文字化けがおこる。
解決策は簡単。
シェルをUTF-8で保存、サーバに上げること。
そうすればシェルがUTF-8になる→ログもUTF-8になる。
→javaもUTF-8→みんなUTF-8になる。
以上。
ちなみに結果は以下の通り
test.logの中身------------------------------------------
Test.sh開始
Javaファイルを実行!
Test.sh終了
--------------------------------------------------------
余談ですが、シェルをShift-JISのまま実行させたい場合には、Javaファイルの出力をShift-JISにしてあげればよい。
つまり、合わせることが重要。
Javaファイルの出力をShift-JISにするのは、FileInputStreamクラスを使用して、
出力時の文字コード指定をする。
(やり方は書きません。UTF-8に合わせればよいと思っているので。)