2

Linux と Windows で次の表示が異なるのはなぜですか?

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));

Windows の場合:

¿

Linux の場合:

¿

4

5 に答える 5

15

System.out.println() はシステムのデフォルトのエンコーディングでテキストを出力しますが、コンソールは独自のエンコーディング (または「コードページ」) 設定に従ってその出力を解釈します。あなたの Windows マシンでは 2 つのエンコーディングが一致しているように見えますが、Linux ボックスでは、コンソールが ISO-8859-1 のようなシングルバイト エンコーディングとしてデコードしている間、出力は明らかに UTF-8 です。または、Jon が示唆したように、ソース ファイルが UTF-8 として保存され、javac別のものとして読み取られている可能性があります。これは、Unicode エスケープを使用することで回避できる問題です。

ASCII テキスト以外のものを出力する必要がある場合、適切なエンコーディングを使用してファイルに書き込み、テキスト エディタでファイルを読み取るのが最善の策です。コンソールは制限が多く、システムに依存しすぎます。ちなみに、このコードは次のとおりです。

new String("¿".getBytes("UTF-8"), "UTF-8")

...出力には影響しません。文字列の内容をバイト配列にエンコードし、再度デコードして元の文字列を再現するだけです。特定のエンコーディングでテキストを出力したい場合は、次のように OutputStreamWriter を使用する必要があります。

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
于 2008-10-06T23:49:22.730 に答える
8

問題が正確にどこにあるかはわかりませんが、注目に値するのは

¿ ( 0xc2,0xbf)

UTF-8でエンコードした結果

0xbf、

これは ¿ の Unicode コードポイントです。

そのため、Linux の場合、出力は utf-8 ではなく、1 バイト文字列として表示されているようです。

于 2008-10-06T21:19:47.183 に答える
6

Linux 端末のエンコーディングを確認してください。

ubuntu の gnome-terminal の場合 - [ターミナル] メニューに移動し、[文字エンコーディングの設定] を選択します。

パテの場合は、構成 -> ウィンドウ -> 翻訳 -> UTF-8 (それが機能しない場合は、この投稿を参照してください)。

于 2008-10-06T21:20:55.340 に答える
2

このコードを実行して、コンパイラーまたはコンソールの問題であるかどうかを判別します。

public static void main(String[] args) throws Exception {
    String s = "¿";
    printHex(Charset.defaultCharset(), s);

    Charset utf8 = Charset.forName("UTF-8");
    printHex(utf8, s);
}

public static void printHex(Charset encoding, String s)
        throws UnsupportedEncodingException {
    System.out.print(encoding + "\t" + s + "\t");

    byte[] barr = s.getBytes(encoding);
    for (int i = 0; i < barr.length; i++) {
        int n = barr[i] & 0xFF;
        String hex = Integer.toHexString(n);
        if (hex.length() == 1) {
            System.out.print('0');
        }
        System.out.print(hex);
    }
    System.out.println();
}

UTF-8のエンコードされたバイトがプラットフォームごとに異なる場合(c2bfである必要があります)、コンパイラの問題です。

コンパイラの問題である場合は、「¿」を「\u00bf」に置き換えます。

于 2008-10-06T21:34:02.893 に答える
1

ソースコードに含まれるバイト、または getBytes() が呼び出されている文字列を正確に知ることは、エディターとコンパイラのエンコーディングが原因で困難です。

まだ問題を示している ASCII (および文字列内の関連する \uxxxx エスケープ) のみを含む短いが完全なプログラムを作成できますか?

問題は Windows または Linux のコンソール出力にあると思われますが、最初に再現可能なプログラムを取得することをお勧めします。

于 2008-10-06T21:10:29.073 に答える