为什么 unicode 字符 \u0004 没有显示在 Javafx TextArea 中

Why unicode character \u0004 is not showing in Javafx TextArea

我有一种算法可以将给定的 unicode 字符串 转换为其他形式。用户必须通过 TextArea 提供此 unicode 字符串 。这个 unicode 字符串包含 (\u0004) 算法处理的字符;

示例字符串:

但问题是字符串 在粘贴到 javafx 中的 TextArea 时被转换为 aaa。见下图

当我使用 .Net 框架时,这不是问题。 .Net Framework 的 TextArea 显示正确,如下图所示

知道如何解决这个问题吗?

这不会解决您的问题,但它可能会帮助您诊断问题并可能会解决它。我写了一个名为 MgntUtils 的开源库,它有几个实用程序。其中一些正在将任何字符串转换为 Unicode 序列,反之亦然。例如你可以做

StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello World")

并得到“\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064”作为结果。方法 StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString( "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064");

会做反向操作。您可以做的是从文本区域复制字符串并将其转换为 unicode。然后你可以看到它是否包含你的 unicodes 并且只是不显示它们或者它们不包含在字符串中(即被过滤掉)。这可能会给你一个好的开始。这是文章的 link,解释了 MgntUtils 库以及从哪里获得它(作为 Maven 工件或在 github),在这两种情况下它都带有源代码和 java 文档。查找名为 "String Unicode converter" 的段落。 MgntUtils

我刚刚检查了实际发生替换的位置。它在 TextArea.TextAreaContent class 中,不幸的是不能用自定义实现替换,因为它被传递给 TextArea 的每个构造函数(至少不是没有反射或自定义 class装载机)。

不过,您可以通过将文本替换为在 TextFormatter 中正确呈现的文本来应用变通方法。如果您需要跟踪 "real" 文本,您还可以使用 TextFormatter 记录更改并覆盖 TextAreacopy 方法以将适当的内容复制到剪贴板。

textArea.setTextFormatter(new TextFormatter<String>(change -> {
    String text = change.getText();
    if (!text.isEmpty()) {
        change.setText(text.replace('\u0004', '\u02e9')); // replace eot char with "valid" one
    }
    return change;
}));

请注意,JavaFX 还会删除所有其他未接受特殊处理的字符 < 0x20