2011-05-17 41 views
6

這是我嘗試爲我的另一個問題(Rendering Devanagari ligatures (Unicode) in Java Swing JComponent on Mac OS X)找到更好的規範時遇到的「元問題」。哪個系統組件負責在Java應用程序中綁定Unicode連字?

我現在還不太瞭解的是給定系統的哪個「組件」(對於更好的單詞而言)負責顯示Java中的Unicode文本,更具體地說是連字

據我明白,下面的部件具有對過程的影響:

  1. 的系統字符編碼(其例如是UTF-8在Mac OS X 10.6,在Windows 7 UTF-16 (根據akira對此的評論superuser.com post))。
  2. Java Charset(默認情況下是Mac OS X 10.6上的MacRoman,Windows 7上的cp1252)。作爲my other question建議由多納爾研究員用來呈現文本
  3. 的字體,以及字體的編碼信息(:

    「字體包括關於他們使用何種編碼信息」

  4. 顯然字符是否呈現存在於各自的Unicode碼點。

因此,如果Unicode字符的字符串不能正確顯示(正如我在另一個問題中所看到的),問題最可能出現在哪裏?即,什麼「組成部分」(一個更好的詞是什麼?)負責「綁定」繃帶,它的組成?

非常感謝您的提前,請讓我知道你是否需要更多的信息。

+0

我會冒險猜測虛擬機,但我在這個問題上沒有證據或專業知識。 – Mr47 2011-05-17 14:34:12

+0

@ Mr47:好的,謝謝,那會是數字(2)。這是哪裏可能派上用場我猜。我會牢記這一點。我已經修改了這篇文章,指出了我的問題對他人的「切入點」。 – 2011-05-17 14:54:34

回答

3

即系統組件稱爲字體渲染器或字體光柵化。它負責根據字體中定義的字形將一系列字符代碼轉換爲像素。正如其他答案所述,您可以從Java中獲取和設置的各種字符編碼值是不相關的。當JVM給字體渲染器一個字符代碼序列時,它會告訴它它應用了什麼編碼(可能是UTF16,但這對Java程序員來說是透明的)。字體渲染器使用字體文件中指定的字體編碼來匹配對應的字體字形。

當前版本的Windows和Mac OS X附帶優秀的字體渲染器。

第一個混淆之處在於JRE帶有自己的字體渲染器,作爲Java2D平臺的一部分,這就是Swing使用的。應該有一個選項來控制Java是使用它自己的渲染器還是系統渲染器。

編輯:作爲McDowell在評論中指出,在OS X,你可以啓用通過設置Java屬性apple.awt.graphics.UseQuartz =真系統渲染器。

混淆的第二點是連字是英文可選的。當桌面出版應用程序看到像「洗牌」這樣的單詞時,它將替換「ffl」連字符(字體中的單個字形),但大多數其他應用程序不會打擾。根據你所說的梵文(以及我剛剛在維基百科上讀到的內容)的說法,我收集的連字詞在該語言中不是可選的。

默認情況下,Java2D字體渲染器不會執行連字。但是,JavaDoc for java.awt.font.TextAttribute.LIGATURES表示始終啓用連字符以編寫需要它們的系統。如果這不是你的經驗,那麼你可能在Java2D字體渲染器中發現了一個錯誤。同時,嘗試使用帶有字體屬性映射的字體構造函數,其中包括TextAttribute.LIGATURES。

+0

非常感謝這個有趣的見解。你說得對,在梵文裏連字並不是可選的。但是,我測試了'LIGATURES_ON'' TextAttribute'(正如[Oracle](http://download.oracle.com/javase/tutorial/2d/text/textattributes.html)所示),並且它沒有不幸的是,事情不會改變。這使得fontconfig文件成爲最令人喜愛的問題來源。 'Map m = new Hashtable (); m.put(TextAttribute.LIGATURES,TextAttribute.LIGATURES_ON); font = font.deriveFont(map); g2。setFont(font);' – 2011-05-18 13:41:38

+1

@ baphomet13 - 看起來你可以使用[Java系統屬性](http://developer.apple.com/library/mac/#documentation/Java/Reference/Java_PropertiesRef/Articles/JavaSystemProperties。 html#// apple_ref/doc/uid/TP40008047)在OS X上切換Java2D和Quartz渲染:'apple.awt.graphics.UseQuartz' – McDowell 2011-05-18 22:30:24

+0

@McDowell:您最近的評論已被發現並解決了我的問題。我可以建議你編輯它到你的答案,所以我可以接受它作爲最好的答案?此外,我已經設置了一個賞金我的相關問題[http://stackoverflow.com/questions/5994815/rendering-devanagari-ligatures-unicode-in-java-swing-jcomponent-on-mac-os-x],並且我建議你在那裏添加你的答案,所以我可以獎賞你的獎勵!非常感謝,你在那裏幫了我很多! – 2011-06-16 15:25:56

2

如果您將嚴格地轉換爲可視化渲染,那麼「編碼」和相關主題不再相關:渲染從String變爲可視化顯示。 String有一個定義(並且不可更改)的編碼,即UTF-16。因此,所有像「我是否用正確的編碼讀取這個二進制流」這樣的問題必須首先解決

文本的實際渲染必須由圖形子系統完成。對於「普通」Java或SWT或任何其他替代系統,這將是AWT/Swing。

第一步(並非嚴格意義上的「渲染」部分)是將一些二進制數據轉換爲String。這可以涉及平臺默認編碼iff該代碼沒有明確指定一些編碼。這是編碼通常發揮作用的步驟。之後,我們進入了開心純正的Unicode域。

+0

非常感謝您的條款說明。恐怕我的解釋不是很具體。然而,我認爲正確的*連字符顯示*(例如,使用七個Unicode代碼點或德語ff構建的熱門標籤)與*字符編碼*(「System」屬性'''文件編碼「')? – 2011-05-17 15:13:30

+0

另外,我已更改標題和文字以反映您的更正。 – 2011-05-17 15:19:27

+0

@baphomet:不,正確的**顯示**不。問題是:您的unicode數據是否包含U + FB00 LATIN SMALL LIGATURE FF還是包含2 U + 0066拉丁小寫字母F? – 2011-05-17 15:27:47

1

與Joachim所說的相似,數據的來源是什麼?如果您正在從文件或流中讀取數據,我肯定會而不是信任系統默認編碼。您應該在讀取數據時明確設置編碼,例如

BufferedReader br = new BufferedReader(new InputStreamReader(file, "UTF-8")); 

或者無論你的編碼流處於

參見:

http://download.oracle.com/javase/1.4.2/docs/api/java/io/InputStreamReader.html#InputStreamReader(java.io.InputStream,%20java.lang.String

+0

好吧,我現在知道爲什麼我引發了Joachim的迴應。事實上,我不*從文件中讀取,而是用Unicode字符串定義了一個'String'變量(例如'String str =「\ u0932 \ u0915 \ u094D \ u0937 \ u094D \ u092E \ u0940」')。這些*在Mac系統上無法正確顯示,但*在Windows系統上正確顯示,這引發了我的問題。我將刪除號碼(3),以便它不會觸發關於閱讀流的更多答案。對不起,我以爲我會爲了完整而把它放在一邊。 – 2011-05-17 15:23:39

3

我不是專家,但希望這些提示將指向您在正確的方向。 ..

源數據的編碼對字體如何呈現幾乎沒有影響。 Java中的所有字符數據都是UTF-16,所以只要您將信息正確地從源代碼轉換爲字符/字符串,就應該保留數據的完整性。

但是,請注意:

  • AWT的系統可以使用默認的系統編碼做字體映射
  • 這是不太可能申請梵文(我不知道,支持它的傳統編碼)

AWT地圖字體是通過fontconfig file。在我的Windows系統上,它映射到Mangal字體:

allfonts.devanagari=Mangal 

毫無疑問,Mac OS上正在使用不同的字體。

原生文本呈現是在Java 6生命週期中的某個時候引入的 - 我不知道它是否對字體支持有影響,或者隻影響渲染速度/反鋸齒等。

+0

感謝您的提示!這聽起來像是我正在尋找的,儘管我的問題來描述問題。我需要一段時間來測試它,但一定會在這裏跟進。 – 2011-05-17 15:45:32

+0

我剛剛查詢了一些Mac用戶,他們都有映射到Mangal for allfonts.devanagari的fontconfig.properties。說實話,我現在完全喪失瞭如何讓我的頭腦爲什麼Mac和Windows顯示器應該有所不同,因此我會很感激任何進一步的提示。 – 2011-05-18 16:22:23

+0

@ baphomet13 - 假設'Mangal'字體在兩個平臺上都是相同的(並且在同一個名稱下沒有不同的實現),那麼我懷疑[gatkin](http://stackoverflow.com/questions/6032401/which-system-component- is-responsible-for-binding-unicode-ligatures-in-a-java-app/6033769#6033769)更接近標記 - 問題可能出現在_how_字體正在呈現中。 – McDowell 2011-05-19 09:04:15

相關問題