12

問題: バイトに変換する特殊文字を含む文字列があり、その逆も同様です。変換は Windows では正しく機能しますが、Linux では特殊文字が正しく変換されません。Linux のデフォルトの文字セットは、Charset で見られるように UTF-8 です。 defaultCharset.getdisplayName()

ただし、オプション -Dfile.encoding=ISO-8859-1 を使用して Linux で実行すると、正しく動作します。

UNIX 環境で -D オプションを設定せずに UTF-8 デフォルトの文字セットを使用して動作させる方法。

編集: jdk1.6.13 を使用します

編集: コード スニペットは cs = "ISO-8859-1"; で動作します。または cs="UTF-8"; winではあるがlinuxではそうではない

        String x = "½";
        System.out.println(x);
        byte[] ba = x.getBytes(Charset.forName(cs));
        for (byte b : ba) {
            System.out.println(b);
        }
        String y = new String(ba, Charset.forName(cs));
        System.out.println(y);

よろしくお願いします

4

3 に答える 3

10

コンパイル プロセスによって文字が破損している可能性があり、クラス ファイルにジャンク データが残っている可能性があります。

オプション -Dfile.encoding=ISO-8859-1 を使用して Linux で実行すると、正しく動作します。

「file.encoding」プロパティは、J2SE プラットフォーム仕様では必要ありません。これは Sun の実装の内部的な詳細であり、ユーザー コードで調べたり変更したりしないでください。また、読み取り専用にすることも意図しています。コマンド ラインまたはプログラム実行中の任意の時点で、このプロパティを任意の値に設定することは技術的に不可能です。

つまり、 -Dfile.encoding=... を使用しないでください。

    String x = "½";

U+00bd (½) は異なるエンコーディングでは異なる値で表されるため:

windows-1252     BD
UTF-8            C2 BD
ISO-8859-1       BD

...ソースファイルがどのエンコーディングとしてエンコードされているかをコンパイラに伝える必要があります。

javac -encoding ISO-8859-1 Foo.java

これで次のようになります。

    System.out.println(x);

PrintStreamとして、これはバイトデータを発行する前にデータをシステムエンコーディングにエンコードします。このような:

 System.out.write(x.getBytes(Charset.defaultCharset()));

一部のプラットフォームでは期待どおりに動作しない場合があります。バイト エンコーディングは、文字が正しく表示されるためにコンソールが期待するエンコーディングと一致する必要があります。

于 2010-01-30T16:18:33.680 に答える
3

あなたの問題は少しあいまいです。Linux の問題を-Dfile.encoding解決したとおっしゃいましたが、これは実際には、ローカル ディスク ファイル システムでファイル名/パス名を管理するために使用するエンコーディングを Sun(!) JVM に通知するためにのみ使用されます。そして...これは、あなたが文字通り与えた問題の説明には当てはまりません:「文字をバイトに変換して文字に戻すことに失敗しました」。これと何の関係があるのか​​ わかりません-Dfile.encoding。物語にはもっと多くのことがあるはずです。それが失敗したとどのように結論付けましたか?これらの文字をパス名/ファイル名などから読み書きしましたか? それとも、標準出力に出力していたのでしょうか? stdout自体は適切なエンコーディングを使用しましたか?

そうは言っても、なぜ文字をバイトとの間で前後に変換したいのでしょうか? これには有用なビジネス上の目的はありません。

(申し訳ありませんが、これはコメントに収まりませんでしたが、実際の機能要件に関する詳細情報があれば、回答で更新します)。

更新:コメントによると:基本的には、適切なエンコーディングを使用してこれらの文字を表示するように stdout/cmd を構成する必要があります。Windows ではコマンドを使用してこれを行うことができますがchcp、大きな注意点が 1 つあります。Windows の cmd で使用される標準フォントには、ISO-8859 文字セット以外の文字に対する適切なグリフ (実際のフォント画像) がありません。レジストリのいずれかをハックして、適切なフォントを追加できます。私はあまり Linux を扱っていないので、Linux については言及しませんが、どうやらそれが-Dfile.encoding進むべき道のようです。結局のところ... cmd をクロスプラットフォームの UI ツールに置き換えて、たとえばSwingなど、文字を思いどおりに表示する方がよいと思います。

于 2010-01-30T15:52:25.443 に答える
1

変換は明示的に行う必要があります。

byte[] byteArray = "abcd".getBytes( "ISO-8859-1" );
new String( byteArray, "ISO-8859-1" );

編集:

Java ファイルのエンコーディングに問題があるようです。Windows で動作する場合は、Linux でソース ファイルをコンパイルしてみてくださいjavac -encondig ISO-8859-1。これで問題が解決するはずです。

于 2010-01-30T15:26:16.403 に答える