- PR -

リモートシェルから呼ばれたSystem.out.println()の文字化け

1
投稿者投稿内容
Piro
常連さん
会議室デビュー日: 2006/03/28
投稿数: 31
投稿日時: 2006-07-28 12:56
Javaプログラムをシェルから読んで実行しているのですが、
そのシェルをリモートから呼ぶと文字化けを起してしまいます。

具体的にはLinux上からrshコマンドで呼んでいるのですが、
英数字以外が全て「?」に化けてしまいます。(呼ばれる側のOSもLinuxです。)
また、Javaプログラム内で出力する文字列をEUC_jpに変換しても
同じでした。

こちらのあたりについて、ご教授いただきたいと思っています。
よろしくお願いいたします。


スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-07-28 17:23
「シェル」というのは「シェルスクリプト」のことですね?

Javaのプログラムの先頭に
コード:
System.out.println(System.getProperty("file.encoding"));


を挿入して、ローカルで実行して上手くいくときと、リモートで実行して上手くいかないときの差を確認してみてください。

次に、Javaプログラムを起動するシェルスクリプトの先頭に、
コード:
echo $LANG
echo $LC_ALL


を挿入して、ローカルで上手くいくときとリモートで上手くいかないときの差を確認してみてください。

引用:

また、Javaプログラム内で出力する文字列をEUC_jpに変換しても
同じでした。


どうやって変換してどうやって表示しました?
Piro
常連さん
会議室デビュー日: 2006/03/28
投稿数: 31
投稿日時: 2006-08-03 12:00
返信が遅れまして申し訳ありません。
スフレさん、ご回答いただきありがとうございます。
以下、試した結果を記載します。

引用:

スフレさんの書き込み (2006-07-28 17:23) より:
「シェル」というのは「シェルスクリプト」のことですね?


説明不足でスミマセン、シェルスクリプトのことです。

引用:

Javaのプログラムの先頭に
コード:
System.out.println(System.getProperty("file.encoding"));


を挿入して、ローカルで実行して上手くいくときと、リモートで実行して上手くいかないときの差を確認してみてください。


・上手くいくとき
「EUC-JP-LINUX」
・上手くいかないとき
「ANSI_X3.4-1968」
となりました。

引用:

次に、Javaプログラムを起動するシェルスクリプトの先頭に、
コード:
echo $LANG
echo $LC_ALL


を挿入して、ローカルで上手くいくときとリモートで上手くいかないときの差を確認してみてください。


・上手くいくとき
---------------------------
ja_JP.eucJP

---------------------------
・上手くいかないときは
---------------------------


---------------------------
となりました。$LC_ALLの箇所はどちらも空白でした。

引用:

引用:

また、Javaプログラム内で出力する文字列をEUC_jpに変換しても
同じでした。


どうやって変換してどうやって表示しました?


String message ="あいうえお";
byte[] eucjpBytes = message.getBytes("EUC_jp");
String msg = new String(eucjpBytes,"EUC_jp");
System.out.println(msg);
といった具合です。


色々いただいたヒントを基に、Javaプログラムを起動するシェルスクリプトの先頭で、
「export LANG=ja_JP.eucJP」と記述したところ、文字化けが発生しないようになり
ました。rshだとLANGなどのユーザの環境変数は上手く拾えなかったりするんでしょうか?
cronで同じシェルを呼んでみても同じ現象になったりもしたのですが…
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-08-03 16:36
引用:

String message ="あいうえお";
byte[] eucjpBytes = message.getBytes("EUC_jp");
String msg = new String(eucjpBytes,"EUC_jp");
System.out.println(msg);
といった具合です。



これは、Unicode→EUC→Unicode としているダケなので、「String msg = message;」と同じことで、意味がありません。「System.out.write(eucjpBytes);」だったら上手く見えたかも知れません。

引用:

rshだとLANGなどのユーザの環境変数は上手く拾えなかったりするんでしょうか?
cronで同じシェルを呼んでみても同じ現象になったりもしたのですが…



シェルにもよりますが、interactive shell と non-interactive shell では読まれる設定ファイルなどが異なることが多いです。
Piro
常連さん
会議室デビュー日: 2006/03/28
投稿数: 31
投稿日時: 2006-08-06 08:33
引用:

スフレさんの書き込み (2006-08-03 16:36) より:

シェルにもよりますが、interactive shell と non-interactive shell では読まれる設定ファイルなどが異なることが多いです。



interactive shell と non-interactive shell について、勉強したいと思います。
Javaについてもシェル(シェルスクリプト)についても、もっと勉強が必要だなと
改めて思いました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)