一些扩展的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控制字符。他们不应该是可见的。您可以通过调用isISOControl
helper方法来检查字符是否为控制字符:
Character.isISOControl((char) 157); // => true
如果一个字符的代码在'u0000'(0)到'u001F'(31)的范围内,或者在'u007F'(127)到'u009F'(159)的范围内,则该字符被认为是ISO控制字符。