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