Java 不显示一些扩展的 ASCII 字符

Java not showing some extended ASCII characters

一些扩展的 ASCII 字符(例如 128 到 159)未显示在 Java 中。相反,它们显示为空白字符。如何解决?

编辑: 下面的代码,

for (int i = 157; i <= 163; i++) {
    System.out.print((char) i);
}

产生输出,

‎‎‎⁣⁣⁣[blank][blank][blank] ¡¢£

[blank]表示一个空白字符。

前三个字符是不可见的。第四个是 160,从技术上讲是可以显示的,因为它是一个不间断的 space 字符。

第 157、158 和 159 个字符是 ISO control characters。他们不应该是可见的。您可以通过调用 isISOControl 辅助方法来检查字符是否为控制字符:

Character.isISOControl((char) 157); // => true

A character is considered to be an ISO control character if its code is in the range '\u0000' (0) through '\u001F' (31) or in the range '\u007F' (127) through '\u009F' (159).

您的代码是正确的但是System.out流不使用扩展的ascii编码。您需要 CP437 代码 table.

例如,您的字符正确显示使用:

$ echo -e -n "\x9D\x9E\x9F\xA0\xA1\xA2\xA3" | recode CP437..utf8
¥₧ƒáíóú

(即可以正常显示)

您可以强制您的 Java 程序使用这个:

$ java ... -Dfile.encoding=CP437 ...

或者您可以使用具有该编码的流或直接转换为二进制,例如:

try(FileOutputStream fstream = new FileOutputStream("/tmp/test.txt")) {
    int from = 157;
    int to = 163;
    byte [] xs = new byte[to - from + 1];
    for (int i = from; i <= to; i++) {
        xs[i - from] = (byte) i;
    }
    fstream.write(xs);
} catch (IOException e) {
    e.printStackTrace();
}

其中输出是正确的 Extended ASCII 文件:

$ recode CP437..utf8 /tmp/test.txt
$ cat /tmp/test.txt 
¥₧ƒáíóú

如果您希望在运行时将该字符转换为 Unicode,您可以使用:

for (int i = 157; i <= 163; i++) {
    System.out.print(new String(new byte[] {(byte)i}, Charset.forName("Cp437")));
}

有输出

¥₧ƒáíóú