- PR -

Javaのプラットフォーム互換(文字エンコード)

投稿者投稿内容
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-02 14:01
日本語Win2000上でコンパイルしたJavaプログラムを英語DebianLinuxにSCP(FTP)で送って動かすとコンソール上の日本語表示が文字化けしてしまいます。ところが、Linux上でコンパイルしてから動かすと文字化けしなくちゃんときれいに表示されるんです。

英語Linuxだと標準文字コードは英語だからString = "";だとプラットフォームのエンコードを使われるのかなと思い、Stringを生成するときに、
コード:
String message = new String(new byte[0], Shift_JIS); //must be encoded using SJIS

と指定したのですがやっぱり直りません。

コンパイル後のClassファイルはどこでもつかるんじゃないのか!なんて一人突っ込んだのですが、どなたか理由を知ってる方いませんか?プラットフォーム上でコンパイルすればいいだけの話なんであまり緊急じゃないんですが、なんででしょうねぇ。

[ メッセージ編集済み 編集者: H2 編集日時 2001-11-02 23:10 ]
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2001-11-02 14:31
> 日本語Win2000上でコンパイルしたJavaプログラムを
> 英語Vine LinuxにSCP(FTP)で送って動かすと
> コンソール上の日本語表示が文字化けしてしまいます。
> ところが、Linux上でコンパイルしてから動かすと
> 文字化けしなくちゃんときれいに表示されるんです。
JDKに関しては、Windows/Linuxともに、国際化対応版を使ってるんですよね???

> String message = new String(new byte[0], Shift_JIS);
> と指定したのですがやっぱり直りません。
String message = new String(new byte[0], "Shift_JIS");
の写し間違い???

> コンパイル後のClassファイルはどこでもつかるんじゃないのか!
基本的に、Sun JDKでコンパイルした中間バイナリ(クラスファイル)は、
Windows / Unix に関係なく、再コンパイルせずにそのまま実行できますよ。
tetsu
会議室デビュー日: 2001/11/02
投稿数: 9
お住まい・勤務地: 名古屋
投稿日時: 2001-11-02 18:15
ソースファイルを EUC で書かれていて、Win2000上でコンパイルする時に、-encodingを指定してないんじゃないでしょうか?
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-02 22:35
引用:

謎の白覆面さんの書き込み (2001-11-02 14:31) より:
JDKに関しては、Windows/Linuxともに、国際化対応版を使ってるんですよね???


もちろんです。私のWin2000はJSDK1.3.1で、大学のVine Linuxは1.3.0です。マイナーな違いですが互換問題は基本的にないはずです。

引用:

謎の白覆面さんの書き込み (2001-11-02 14:31) より:
String message = new String(new byte[0], "Shift_JIS");
の写し間違い???


すみません、ご指摘どうりです。写し間違えました。

引用:

謎の白覆面さんの書き込み (2001-11-02 14:31) より:
> コンパイル後のClassファイルはどこでもつかるんじゃないのか!
基本的に、Sun JDKでコンパイルした中間バイナリ(クラスファイル)は、
Windows / Unix に関係なく、再コンパイルせずにそのまま実行できますよ。


そうですよね。そのままの中間バイナリで実行はするんですが、日本語表示だけが文字化けしてしまうんです。

引用:

tetsuさんの書き込み (2001-11-02 18:15) より:
ソースファイルを EUC で書かれていて、Win2000上でコンパイルする時に、-encodingを指定してないんじゃないでしょうか?


私もそう思ったので試しました。ソースはSJIS、EUC両方でやってみたのですが×でした。

うーん、なんでだろう。気になります。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-02 22:41
引用:

謎の白覆面さんの書き込み (2001-11-02 14:31) より:
JDKに関しては、Windows/Linuxともに、国際化対応版を使ってるんですよね???


もちろんです。私のWin2000はJSDK1.3.1で、大学のVine Linuxは1.3.0です。マイナーな違いですが互換問題は基本的にないはずです。(よね?)

引用:

謎の白覆面さんの書き込み (2001-11-02 14:31) より:
String message = new String(new byte[0], "Shift_JIS");
の写し間違い???


すみません、ご指摘どうりです。写し間違えました。

引用:

謎の白覆面さんの書き込み (2001-11-02 14:31) より:
> コンパイル後のClassファイルはどこでもつかるんじゃないのか!
基本的に、Sun JDKでコンパイルした中間バイナリ(クラスファイル)は、
Windows / Unix に関係なく、再コンパイルせずにそのまま実行できますよ。


そうですよね。それがJavaの特徴といか良いところじゃないですか。"Written once, runs everywher"のはずなのに・・・。そのままの中間バイナリで実行はするんですが、日本語表示だけが文字化けしてしまうんです。でも、Linuxでコンパイルしてから実行すると何も問題なく動くんです。

引用:

tetsuさんの書き込み (2001-11-02 18:15) より:
ソースファイルを EUC で書かれていて、Win2000上でコンパイルする時に、-encodingを指定してないんじゃないでしょうか?


私もそう思ったので試しました。ソースはSJIS、EUC両方でやってみたのですが×でした。

うーん、なんでだろう。ぜんぜん、問題ではないのですが気になります。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-11-02 22:53
逆はどうですか?
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-02 23:10
自分なりの実験です。
私のPCは「日本語Win2000+J2SDK1.3.1」
大学側は「英語Debian Linux 2.4.7-Server + J2SDK1.3.0」
両側で付属のHotSpot対応のjavaとjavacを使用。(jikesなどの他コンパイラではない)
ファイル転送はCygwinのscpを使用。

サンプルプログラム(やっぱりHelloWorldでしょ):
コード:
import java.io.UnsupportedEncodingException;

public class HelloWorld
{
public static void main(String[] args) throws UnsupportedEncodingException
{
String msg = new String(new byte[0], "Shift_JIS");;
msg = "こんにちはみなさん!";
System.out.println(msg);
}
}



コンパイル: "javac -encoding Shift_JIS HelloWorld.java"
実行:"java HelloWorld"

実験@
Win2000側でコンパイルし、scpでlinux側に転送の後、HelloWorld.classをLinux上で実行
結果@
「こんにちはみなさん!」は表示されず「??????????」が表示される。

実験A
Linux側でコンパイルし、HelloWorld.classをLinux上で実行
結果A
「こんにちはみなさん!」が表示される。

実験B
Linux側でコンパイルし、scpでWin2000側に転送の後、HelloWorld.classをWin2000上で実行
結果B
「?±?????????????????I」が表示される。

実験C
Win2000側でコンパイルし、HelloWorld.classをWin2000上で実行
結果C
「こんにちはみなさん!」が表示される。

という感じです。"Shift_JIS"を"EUC-JP"に変えても同じ現象。ソースファイルのエンコードをSJISからEUCに変えても同じ。改行コードもCRLFとLF両方試したがやっぱり同じ現象。

うーん。ますます気になる。


[ メッセージ編集済み 編集者: H2 編集日時 2001-11-02 23:18 ]
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-02 23:15
引用:

しょむさんの書き込み (2001-11-02 22:53) より:
逆はどうですか?


実は問題が見つかったプログラムは大学のSMTPを使用するので、私のWin2000だと実行できないんです。その代わり、もっとシンプルなHelloWorldで試したのですが、逆もやっぱりだめでした。(上記参照)各プラットフォームでコンパイルしないと文字化けしてしまいます。

1.3.0と1.3.1の違いですかねぇ。あと気になるのは日本語版Linux上ではどうかってところですね。実行環境がないんで調べにくいです。


[ メッセージ編集済み 編集者: H2 編集日時 2001-11-02 23:18 ]

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