Eclipse详细格式化程序字符串未显示所有Unicode字符。

6

我希望在调试器中看到剪贴板符号:(U+1F4CB)。

我理解这两个码点。 enter image description here

其中:

  • \ud83d 是 ߓ
  • \u8dccb 是

我希望对其进行详细格式化,以便在Unicode的调试提示中查看。

我的当前详细格式化程序(首选项->Java-Debug->详细格式化程序)如下:

new String(this.getBytes("utf8"), java.nio.charset.Charset.forName("utf8")).concat(" <---")

以上代码仅在详细视图中添加了<---,没有其他效果。

问题1:

我需要哪种格式化程序才能正确显示黄色提示框中的字符?

源代码

import java.nio.charset.Charset;

public class Test {
    public static void main(String[] args) {
        byte[] db = new byte[] { -16, -97, -109, -117 };
        String x = new String(db, Charset.forName("utf8"));
        System.out.println(x);
        return;
    }
}
2个回答

4

“”字符已在Unicode字符集中定义,由于String实例是Unicode字符序列,因此它们可以包含该字符。但它位于基本多文种平面之外,因此处理该字符的软件必须更加小心谨慎。最值得注意的是,它不能尝试将其处理为单个char值,这些值是UTF-16单位,需要将这样的字符处理为代理字符对。

您指定的详细格式化程序为

new String(this.getBytes("utf8"), java.nio.charset.Charset.forName("utf8")) …

这里的问题并不在于this.getBytes("utf8"),它将Unicode String实例转换为使用UTF-8编码的byte[]数组,然后传递给new String(…, Charset.forName("utf8"))构造函数,将字节数组转换回相同的String实例。如果Eclipse的调试器未能呈现原始字符串,则它不会在执行冗余操作后正确地呈现相同的字符串。

通常,如果Eclipse的调试器不能正确呈现包含基本多语言平面之外字符的字符串,则在详细格式化程序中无法修复此问题,因为您在那里执行的所有处理最终都将以String形式呈现,可能需要应用一系列详细格式化程序。因此,最终结果只能是两种选择之一,即删除具有问题字符的String或Eclipse的调试器无法正确呈现的String

换句话说,这是只能在Eclipse方面解决的错误。


一个utf8字符是utf8编码中的unicode字符。使用utf8字符这个术语,我首先传输信息,即它是一个unicode字符,然后在第二步中传输附加信息,即unicode字符如何编码:以utf8方式。没有原子性的东西叫做utf8字符,但确实存在“utf8字符”这样的东西!我不接受“如果(...)你无能为力(...)”这种说法,因为我可以编写错误报告或等待解决现有的错误报告。 - Grim
@PeterRader 我明确地说“在详细格式化程序中你无能为力”。这并不排除错误报告。无论如何,你的术语用法是错误的。你的字符串没有以UTF-8编码。它是以String实现内部使用的任何编码方式编码的,通常是UTF-16,但这并不重要,因为软件接口是以Unicode定义的。正如所解释的那样,将其转换为UTF-8,然后再转换回String完全过时了,因为结果字符串与原始字符串相同。这证明了,“utf-8字符”这种说法是多么荒谬。 - Holger
我绝对知道将字符串转换为字节,再转换回字符串已经过时了,但它迫使人们在投票、回答或投票无意义的答案之前先思考。 - Grim
1
我不知道你的问题的目的是什么。我耐心地解释了,无论你在中间做什么,Eclipse Detail Formatter 的最终结果始终是一个 String 实例,并且 UTF-8 编码与 Eclipse 的 Detail Formatter 没有任何关系。中间转换为 UTF-8 只会分散注意力。你因此给了我负评,并发表了一些关于“UTF-8 字符”是一种东西以及对我的句子“在 Detail Formatter 中没有任何事情可以做”进行错误引用的抱怨,所以你可以自由地解释一下你的问题中实际有价值的内容。 - Holger
1
对于交换字节的软件,考虑字符集和编码是有意义的,但问题在于整个过程已经以Unicode、Java String、JVM的调试接口以及Java软件Eclipse为基础。理论上,它应该已经可以工作,在实践中,它适用于BMP中的所有代码点,即0 - \uFFFF范围内。它不能处理SMP字符,即\uFFFF以上的字符,这是一个错误。由于传输协议良好,因此无需选择编码。这是一个错误。 - Holger
显示剩余2条评论

0

你的代码和剪贴板表情符在 IntelliJ 2018.1 中运行良好。调试器的变量视图和控制台输出都正常工作。

这不太可能是代码的问题。也许是你在 Eclipse 中使用的字体无法打印出 UTF 表情符号?我想象 Eclipse 在显示工具提示时理解码点的概念。

我在 IntelliJ 中执行的代码:

byte[] db = new byte[] { -16, -97, -109, -117 };
String x = new String(db, Charset.forName("utf8"));
System.out.println(x);
String f = new String(x.getBytes("utf8"), Charset.forName("utf8")).concat(" <---");
System.out.println(f);

并在调试器中观察到以下内容:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接