都知道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。