- PR -

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

投稿者投稿内容
tetsu
会議室デビュー日: 2001/11/02
投稿数: 9
お住まい・勤務地: 名古屋
投稿日時: 2001-11-03 12:11
引用:

H2さんの書き込み (2001-11-02 23:10) より:

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




http://java.sun.com/j2se/1.3/ja/docs/ja/guide/intl/encoding.doc.html

を見てもらうと分かりますが、-encodingで指定するエンコーディングが
ちょっと違います。"Shift_JIS"→"SJIS"、"EUC-JP"→"EUC_JP"です。


H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-03 13:42
いや、"SJIS"でも"Shift_JIS"でも変わりはないのでは?
存在しない文字コードを使用するとコンパイル時には:
コード:
エラー: compiler message file broken:
key=compiler.err.java.io.UnsupportedEncodingException: 
hogehoge arguments=null, null, null, null, null, null, null


実行時にもjava.io.UnsupportedEncodingExceptionが送出されるはずです。

一応ソースファイルを"SJIS"と"EUC_JP"で指定しましたが、症状は同じでした。
tetsu
会議室デビュー日: 2001/11/02
投稿数: 9
お住まい・勤務地: 名古屋
投稿日時: 2001-11-03 16:10
う〜ん、そうなると難しいですねぇ。

現在、開発時にNT 4.0 + J2SDK1.3.1 + CygwinでEUCで作成して、.classはそのまま
稼働環境の Miracle Linux 1.0 + J2SDK1.3.1に持ってって動かしていますけど、
特に文字化けすることはないですが…

ただ、scpは使ったことが無くて、いつもftpですが。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-11-03 22:15
コード:
public class HelloWorld {
  public static void main(String[] arg) {
    String word = new String("\u3053\u3093\u306b\u3061\u306f");
    System.out.println(word);
    char[] buf = word.toCharArray();
    for (int i=0; i<buf.length; i++) {
      System.out.print(Integer.toString(buf[i], 16) + " ");
    }
    System.out.println();
  }
}



これで実験してみてください。

しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-11-03 22:24
はぅん…バックスラッシュのエスケープがされないのね…

String word = new String("\\u3053\\u3093\\u306b\\u3061\\u306f");

です。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-11-04 03:38
上記のプログラムを 1.3.1 でコンパイルし、1.3.0_01 で実行したところ、大丈夫ですね。逆もOK。どちらも Linux です。

ただし、class ファイルがサイズは同じで中身が違いました。とはいえ、hexdump の結果を見る限り、文字列が違うような印象はうけませんでしたが。javap -c によるディスアセンブルコードは同じでした。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2001-11-04 08:12
引用:

しょむさんの書き込み (2001-11-04 03:38) より:
上記のプログラムを 1.3.1 でコンパイルし、1.3.0_01 で実行したところ、大丈夫ですね。逆もOK。どちらも Linux です。

ただし、class ファイルがサイズは同じで中身が違いました。とはいえ、hexdump の結果を見る限り、文字列が違うような印象はうけませんでしたが。javap -c によるディスアセンブルコードは同じでした。


しょむさんのコードを試したところ、今度はLinux上でコンパイルしても??????になってしまいました。Win2000だとちゃんと文字列が表示されます。

オリジナルのHelloWorldをWinでコンパイルしたのをLinuxでjavap -c を使ったところ、文字列のところだけだけ綺麗に”?????”になっていました。逆もまた同じ。プラットフォーム上でコンパイルすると、”?????”ではなく”こんにちはみなさん”に入れ替わります。

ちょっと気になって、自分のRedHat7.1(英語)にJSDK1.3.1(日本語版)をいれてみたところ、同じ現象でした。多分JSDKは何語でもまったく同じだと思うので英語版Linuxがいけないのではないかと思うのですが。しょむさんのはLinuxは両方とも日本語版ですか?tetsuさんのMiracle Linuxは日本語版ですよね。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-11-04 15:38
う〜ん、Unicode escape のものがうまく表示されない?
Linux でコンパイルしたものが同じ Linux で?
それはあきらかに jdk か jvm か glibc か設定がおかしい。

まず、LANG は設定されていますか?LANG=ja_JP.eucJP。
これがないと、当然デフォルトの C locale なので ISO8859-1 しか理解してくれず、????? になりますよ。

コード:
~/tmp/java % java -classpath . HelloWorld 
こんにちは
3053 3093 306b 3061 306f 
~/tmp/java % LANG=C java -classpath . HelloWorld
?????
3053 3093 306b 3061 306f 



表示は「?」になっても、下にでている内部文字コードはダンプされていますので、コンパイル時の問題なのか実行時の問題なのかは切り分けできると思うのですが。

WinでコンパイルしたクラスをLinuxで実行した時に 3053...306f となっていなければ、コンパイル時の問題。なっているのであれば、実行環境の問題。



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