在swing应用程序中显示unicode字符有问题。
在认为问题是使用的字体,它没有包含适合中文字符。
(只显示空框)
以下是关于我的问题的更多信息(我做了一些调查):
Linux (Kubuntu14.04)
当我用JAVA 6启动我的程序时,汉字是未显示的(仅为空框)。
(通过getFont()查询标签字体返回: DejaVu Sans)
当我用JAVA 7启动我的程序时,汉字就会正确显示!
(通过getFont()查询标签字体返回: DejaVu Sans)
视窗(8.1)
当我用JAVA 6启动我的程序时,汉字就会正确显示!
(通过getFont()询问标签字体返回: SansSerif)
当我用JAVA 7启动我的程序时,汉字就会正确显示!
(通过getFont()询问标签字体返回: SansSerif)
$ java _HOME/lib/fonts (似乎用作回退字体)两个java版本(6+7)都包含相同的字体。(在这两个系统上)
字体文件的大小(Java6 + Java7)和fontconfig.properties.src也是一样的。
当我直接询问标签(通过getFont())时,它在Windows8.1上返回"SansSerif“,在我的Kubuntu上返回"DejaVu Sans”(14.04)。
(见截图)
在Linux上使用JAVA 6启动:

在Linux上使用JAVA 7启动:

Windows上的"SansSerif“显示字符是正确的,但是使用的是哪种SansSerif?SansSerif女士(名字中唯一有SansSerif的字体)并没有所有这些汉字。
编辑
DejaVuSans也是如此。
看起来DejaVu Sans没有汉字!(然而,它们是显示的!)
编辑2
我尝试了安德鲁发布的代码(参见:How to determine if 2 fonts have equivalent glyphs?),但使用的是中文示例文本
其结果是:
在Linux上使用JAVA 6启动:

在Linux上使用JAVA 7启动:

编辑3
在这里,我测试过的字符串:
String s = "\u6253\u5370\u8FC7\u671F\u8BC1\u4E66\u8BB0\u5F55"; //means: 打印过期证书记录
JOptionPane.showMessageDialog(null, s);的问题是:
哪一种字体(在系统上)是真正使用的,我如何找出?
提前感谢!
发布于 2014-09-06 13:51:27
这是我自己问题的答案。
我做了更多调查:
看起来,对于某些类型的语言(字符),使用了特殊的配置。
支持Linux和Solaris 11字体 过去,JDK的逻辑字体是在fontconfig.properties文件中静态指定的。然而,在Linux的各种实现中,字体的存在并没有一致性。因此,如果没有自定义文件,Asian (CJK)文本等就不会呈现为。在JDK 7中,在Linux上,对于Solaris 11,在没有为OS版本定制fontconfig.properties文件的情况下,默认行为是使用系统libfontconfig来选择用于逻辑字体的字体。在这种情况下,逻辑字体将反映使用相同平台库的Gnome/KDE桌面应用程序所使用的字体。
这就是我在这里发现的:http://docs.oracle.com/javase/7/docs/webnotes/adoptionGuide/
这意味着首先,在Java 6和Java 7中选择正确的字体是有区别的。
接下来,我检查了我的(java 6) fontconfig-文件,发现了以下内容(仅限于重要的部分):
组件字体映射allfonts.chinese-cn-iso10646=-arphic-ar pl light-r-normal-%d sequence.allfonts.UTF-8.zh.CN=latin-1-cjk,中文-cn-iso10646 10646 顺序.allfonts.UTF-8.zht.w=拉丁文-1-CJK,中文-tw-cjk 10646 顺序.allfonts.UTF-8.zh.HK=拉丁文-1-cjk,中文-hk-cjk 10646
当默认字体无法显示请求的字符时,应使用此指定字体(此处:uming.ttc)。
之后,我检查了/usr/share/fonts/truetype/arphic/uming.ttc.的存在。
这个字体/文件是而不是!
(我查看了3种不同的Ubuntu安装!)
我不知道为什么它没有安装(但是在java fontconfig中使用),而是在执行之后(在不同的PC上,但有相同的问题):
sudo apt-get install fonts-arphic-uming为了安装缺少的字体,我再次进行了测试(使用Java6):

现在一切似乎都好起来了。
(我认为nims的答案也有类似的方向,但它(在我看来)太broadly.Further了,java并不真正将混合和匹配字体。
发布于 2014-09-05 10:47:24
Java 7在Linux上使用fontconfig,因此它知道如何在缺少字体的时候后退。要检查在给定系统上使用的fc-*命令,可以使用fc-*命令(fc-match,等等)。
但是,除了系统规则(fontconfig*xml)之外,jre还可能包含私有回退规则。
您不能在java 6上模拟这种行为,因为fontconfig不是一个简单的优先级列表,其中在任何给定时间都使用单个字体。它将混合和匹配字体,这取决于文本显示的需求和应用程序所表达的首选项(字体模式)。
如果有一种字体能够显示系统上的文本,则启用fontconfig的软件将始终工作。当应用程序中硬编码的字体名称与可用的字体名称不匹配时,不使用fontconfig的应用程序就会失败。Linux系统上安装的字体有很大的不同,您不能期望一个安装上的字体也会出现在另一个安装中(正因为所有现代Linux应用程序都使用fontconfig而不关心)。
https://stackoverflow.com/questions/25663165
复制相似问题