關于java字符輸出到界面時的問題
都知道java的字符編碼方案是采用unicode的。比如 String test = "test 編碼";
那么"test 編碼"是采用unicode編碼后的二進制形式保存。
然而如果要把test輸出到系統邊界以外的地方,那么都可能要涉及到編碼轉換問題,無論是文件還是網絡的另一端。
不過沒關系,java提供了強大的I/O庫,有Reader 和 Writer兩個適配器體系,我們可以將test以我們想要的編碼方案輸出。
但是如果將test的東西輸出到界面時到有些問題了,本來從概念上界面也是系統的邊界,所以unix有一切皆文件的抽象,當然如果界面是交互 性GUI時這個抽象顯然是不夠的,這就不論了。關鍵是GUI系統并沒有提供類似javaI/O的這種能力,java也沒有直接以unicode形式輸出給 GUI系統,而是好像會把內存中變量字符再通過系統默認語言(字符集)編碼去轉換,然后扔給繪圖系統吧!
這樣的話如果 JLable label = new JLabel(test);
那么這個label的顯示在簡體中文版的OS上沒問題,但如果在繁體中文版的OS可能就有問題了。
按理說swing是獨立于本地OS的GUI系統,但是他還是建立在java2D上,而java2D還是要利用本地的繪圖系統,像渲染文字這種繪圖是不是java2D還是利用了本地繪圖系統呢!
java GUI “?” “口” 這兩個我都碰到過。
如果某中編碼方案里沒有這個文字,java會用" ?"這個代替。
如果某種文字沒有相應的字體,java會用"口"代替。
java在輸出到系統界面時會把內存中變量字符再通過系統默認語言(字符集)編碼去轉換!
我覺得如果java自己實現所有unicode支持的文字的繪圖(基于更低級的圖形API),那么他沒有必要轉,因為unicode字符給java圖形系統,他都能把它表現出來,當然java圖形系統基于OS的更低級的圖形API。
是不是java自己實現所有unicode支持的文字的繪圖這項任務比比較困難。
如果java能做到這樣真的很強大啊!
這樣的話JLable label = new JLabel(test); 無論在什么語言版的OS 都OK。