2017-06-12 67 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從它的分解形式轉換爲它的組成形式,這其中的文本字段似乎與發揮很好。