Linux と Windows で次の表示が異なるのはなぜですか?
System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));
Windows の場合:
¿
Linux の場合:
¿
Linux と Windows で次の表示が異なるのはなぜですか?
System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));
Windows の場合:
¿
Linux の場合:
¿
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");
問題が正確にどこにあるかはわかりませんが、注目に値するのは
¿ ( 0xc2,0xbf)
UTF-8でエンコードした結果
0xbf、
これは ¿ の Unicode コードポイントです。
そのため、Linux の場合、出力は utf-8 ではなく、1 バイト文字列として表示されているようです。
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である必要があります)、コンパイラの問題です。
コンパイラの問題である場合は、「¿」を「\u00bf」に置き換えます。
ソースコードに含まれるバイト、または getBytes() が呼び出されている文字列を正確に知ることは、エディターとコンパイラのエンコーディングが原因で困難です。
まだ問題を示している ASCII (および文字列内の関連する \uxxxx エスケープ) のみを含む短いが完全なプログラムを作成できますか?
問題は Windows または Linux のコンソール出力にあると思われますが、最初に再現可能なプログラムを取得することをお勧めします。