Java TextField的奇怪Unicode行为

Java TextField的奇怪Unicode行为,java,javafx,unicode,Java,Javafx,Unicode,6月20日更新 总结: 鉴于以下情况: String problemString = "é"; JavaFX8的TextField在显示problemString的内容时遇到问题,如果设置如下: aTextField.setText(problemString); 在Windows 10上,上面的文本字段使用“МЃ”而不是“é”,在macOS 10.12上,文本字段将显示“é”,但会有很多错误,实际上是无用的 另外值得注意的是,只有在使用setText()方法的情况下,TextField在将

6月20日更新

总结:

鉴于以下情况:

String problemString = "é";
JavaFX8的TextField在显示problemString的内容时遇到问题,如果设置如下:

aTextField.setText(problemString);
在Windows 10上,上面的文本字段使用“МЃ”而不是“é”,在macOS 10.12上,文本字段将显示“é”,但会有很多错误,实际上是无用的

另外值得注意的是,只有在使用setText()方法的情况下,TextField在将problemString的内容复制并粘贴到任何一个操作系统上都没有问题

6月12日更新

我已进一步缩小了这个问题的范围。我遇到的问题不是预合成的字符(U+00E9),而是由e+组成的◌́

Java将在macOS上正确显示这些字符,但TextField非常容易出错,不允许编辑文本

原创

我有一个程序,可以从文件中读取unicode UTF-8格式的文本,并以字符串形式存储内容。在程序中的某个时刻,这些字符串的内容被加载到文本字段中,以便用户进行编辑。我的问题是某些unicode字符没有正确显示。但是,如果文本被保存回一个文件,一个新的或旧的,内容将是正确的。还要注意的是,这种情况仅在Windows(10)上发生,而在macOS(10.12)上则不会发生。知道是什么原因造成的吗,或者如何修复

例如:


我从文本文件中读入字符“é”,并将其存储在字符串中。在文本字段中显示时,我将看到“МЃ”而不是“e”。但是,如果我继续使用该程序并将其保存到文本文件中,该文件将包含一个“e”。

问题在于unicode允许存储字符的可能方式。在这种情况下,“é”有两种表示方式

1。作为单个unicode字符,组合形式:

é(U+00E9拉丁文小写字母E随以锐音符)

2。作为两个字符的组合,分解形式:

e(U+0065拉丁文小写字母e)

◌́(U+0301组合尖锐重音)

如果字符串为分解形式,则TextField似乎不喜欢使用.setText()方法显示字符串

我解决这个问题的方法是使用


上面的代码使用Java Normalizer类将problemString从其分解形式转换为其组合形式,TextField似乎可以很好地处理这个问题。

您应该尝试更改字体。您使用的字体可能不支持特殊字符“é”,这可能是所用字符编码的问题。读取/写入文件时,请尝试指定正确的编码。@Razib。也许。我将尝试一下,字体当前设置为“系统”。奇怪的是,它不支持“é”,却支持陌生人“МЃ”。@fabian,再深入一点,这个角色正在发生一些奇怪的事情。如果我直接从文件中复制并粘贴它并检查其unicode代码(使用Swift),我得到U+0065(这是一个普通的e)。此外,如果我尝试在此注释框中键入该字符,然后将其删除,第一次尝试将删除其重音(留下一个普通的e),只有第二次尝试将完全删除该字符。您可以尝试先使用Java中的
Normalizer
类对字符串进行规范化。
String fixedString = Normalizer.normalize(problemString, Normalizer.Form.NFC);
aTextField.setText(fixedString);