2017-06-12 66 views
0

UPDATE 6月20日奇怪的统一行为

摘要:

考虑以下几点:

String problemString = "é"; 

JavaFX8的TextField有,如果它被设置为显示problemString的内容烦恼如下:

aTextField.setText(problemString); 

在Windows 10上,产生“МЃ”而不是“é”,而在macOS 10.12上,TextField将显示“é”,但会非常麻烦并且毫无用处。

另外值得注意的是,TextField在使用setText()方法时,在任何操作系统上复制和粘贴problemString的内容都没有问题。

UPDATE 6月12日

我已经进一步缩小的问题。 é我有问题不是预先组合的字符(U + 00E9),而是由e + composed组成。

Java将在macOS 上正确显示这些字符,但 TextField非常糟糕,并且不允许编辑文本。

ORIGINAL

我有一个程序,读取文本,以Unicode UTF-8格式,从一个文件,并存储在字符串的内容。在程序中的某个点,这些字符串的内容将被加载到TextField中,以便用户进行编辑。我的问题是某些unicode字符显示不正确。但是,如果文本保存回文件,新文件或旧文件,内容将是正确的。另外要注意的是,这只发生在Windows(10)上,在macOS(10.12)上不会发生此问题。任何想法是什么造成这种情况,或如何解决它?

例如:

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

+0

你应该尝试改变字体。我是您使用的字体不支持特殊字符“é” – Razib

+0

这可能是使用字符编码的问题。尝试在读取/写入文件时指定正确的编码。 – fabian

+0

@Razib。也许。我会试试看,字体目前设置为“系统”。看起来奇怪的是,它不支持“é”,而支持陌生人“МЃ”。 – user9985

回答

0

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

1.作为单个Unicode字符,合成形式:

E(急性U + 00E9拉丁小写字母E)

2。由于两个字符,被分解的形式AA组合:

E(U + 0065拉丁小写字母E)

◌(U + 0301组合重音符)

看来,文本字段不不像使用.setText()方法显示字符串(如果字符串处于分解形式)。

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

String fixedString = Normalizer.normalize(problemString, Normalizer.Form.NFC); 
aTextField.setText(fixedString); 

上面的代码使用Java类正规化,以便将problemString从它的分解形式转换为它的组成形式,这其中的文本字段似乎与发挥很好。