【问题标题】:Java not showing some extended ASCII charactersJava 没有显示一些扩展的 ASCII 字符
【发布时间】:2021-10-18 18:50:25
【问题描述】:

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

编辑: 以下代码,

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

产生输出,

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

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

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

【问题讨论】:

标签: java ascii


【解决方案1】:

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

例如,您的字符使用以下命令正确显示:

$ 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();
}

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

有输出

¥₧ƒáíóú

【讨论】:

    【解决方案2】:

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

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

    如果字符的代码在“\u0000”(0)到“\u001F”(31)范围或“\u007F”(127)到“ \u009F' (159)。

    【讨论】:

    • 他明确希望显示扩展 ascii 代码页(CP437)。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2011-04-26
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多