在 uxterm 上用 Java 打印代理 UTF 字符

问题描述 投票:0回答:1

我终于不得不处理 Java 中的代理 UTF 字符了。我在尝试在 Cygwin 启动的 uxterm 上打印它们时遇到问题。

这是一个示例程序。它打算打印数学斜体小 i (代码点 119894):

public class PrintChar {
    public static void main(String[] args) throws Exception {
        int codepoint = 119894; // Mathematical italic small i
        String s = new StringBuilder().appendCodePoint(codepoint).toString();
        System.out.println("Codepoint " + codepoint + "=" + s);
    }
}

当我运行它时,我得到输出:

$ java -Dfile.encoding=UTF-8 -cp bin PrintChar
Codepoint 119894=?

但是当我通过

cat
管道输出时,我得到了预期的结果:

$ java -Dfile.encoding=UTF-8 -cp bin PrintChar | cat
Codepoint 119894=𝑖

有人可以解释一下为什么吗?常规 cygwin 终端也会发生这种情况。在通过 VMware vSphere 运行的终端中不会发生这种情况。在那个终端上,我不需要管道来看到斜体 i。

java unicode cygwin-64
1个回答
0
投票

在使用编码时,您应该始终记住有两个操作:编码和读取。

我猜猜发生了什么。这 ?您在终端上看到的是 cygwin 如何解码在三字节数组 11、98、94 上编码的 utf-8 字符。?当 cygwin 无法理解您提供的字符时,可能是“小丑”字符。通过使用 cat,cat 可能理解 utf-8 字符,并检测到您的 cygwin 终端未配置为渲染 utf-8,car 正在将字符转换为另一种编码字符集(CP1252 - ISO8859?)。

您可以将 cat 的结果放入一个文件中,对该文件进行十六进制编辑并检查二进制结果。它肯定已经改变了,给这个值你可以尝试找到它是哪种编码。

要解决您的问题,我认为您只需更改 cygwin 的默认字符集即可。

© www.soinside.com 2019 - 2024. All rights reserved.