Java不显示一些扩展ASCII字符



一些扩展的ASCII字符,如128到159在Java中不显示。相反,它们显示为空白字符。如何解决这个问题?

编辑:下面的代码

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

产生输出,

‎‎‎⁣⁣⁣[空白][空白][空白]¡¢£

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

前三个字符是不可见的。第四个是160,从技术上讲,它是一个不可分割的空格字符。

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

例如,使用

可以正确显示字符:
$ echo -e -n "x9Dx9Ex9FxA0xA1xA2xA3" | 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();
}

,其中输出是正确的扩展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")));
}

与输出

¥₧ƒáíóú

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

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

如果一个字符的代码在'u0000'(0)到'u001F'(31)的范围内,或者在'u007F'(127)到'u009F'(159)的范围内,则该字符被认为是ISO控制字符。

最新更新