どちらかというとごはん派

主に仕事用のメモブログ。

【bash】 シェルからjavaを呼ぶ ②文字コード編

2008年10月16日 17時59分05秒 | linux bash
【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に合わせればよいと思っているので。)


【bash】 シェルからjavaを呼ぶ ①実行編

2008年10月16日 16時16分18秒 | linux bash
・条件①
 事前にjavaがインストールされていること。
 javaのインストールに関しては、他エントリーでじっくり説明します。

・条件②
 javaファイルを設定してコンパイル済みであること。
 (javac Test.javaを行っていること)

Test.javaの中身-----------------------------------------
public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  System.out.println("Javaファイルを実行!");
 }

}
--------------------------------------------------------

Test.shの中身-------------------------------------------
#!/bin/sh
java Test
--------------------------------------------------------

実行するコマンドを叩く
$ sh Test.sh
Javaファイルを実行!

↑出力されることを確認する。