なぜ¿ UTF-8を使用している場合でも、WindowsとLinuxで表示が異なりますか?

StackOverflow https://stackoverflow.com/questions/176196

  •  05-07-2019
  •  | 
  •  

質問

以下がLinuxとWindowsで異なるのはなぜですか?

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

Windowsの場合:

¿

Linuxの場合:

¿

役に立ちましたか?

解決

System.out.println()はシステムのデフォルトエンコーディングでテキストを出力しますが、コンソールは独自のエンコーディング(または「コードページ」)設定に従ってその出力を解釈します。 Windowsマシンでは2つのエンコードが一致しているように見えますが、Linuxボックスでは、出力は明らかにUTF-8であり、コンソールはISO-8859-1のようなシングルバイトエンコードとしてデコードしています。あるいは、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");

他のヒント

問題の正確な場所はわかりませんが、注意する価値があります

¿ (0xc2,0xbf)

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

0xbf、

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

したがって、Linuxの場合、出力はutf-8としてではなく、シングルバイト文字列として表示されます

Linuxターミナルのエンコーディングを確認します。

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

パテの場合、設定->ウィンドウ->翻訳-> UTF-8(およびそれが機能しない場合は、この投稿)。

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

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 である必要があります)、これはコンパイラの問題です。

コンパイラの問題である場合は、&quot;&#191;&quot; &quot; \ u00bf&quot; を使用します。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top