なぜ¿ UTF-8を使用している場合でも、WindowsとLinuxで表示が異なりますか?
-
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のコンソール出力に問題があるのではないかと思われますが、最初に再現可能なプログラムを入手することをお勧めします。