Unicode char不能在Swing中呈现,实际使用什么字体?

Ben*_*Ben 4 java unicode fonts swing

我在swing应用程序中显示unicode字符时遇到问题.
认为问题是使用的字体,它不包含适合中文的字符.
(仅显示空)

以下是我的问题的一些信息(我做了一些调查):
Linux(Kubuntu 14.04):
当我用JAVA 6启动我的程序时,不显示中文字符(只有空框).
(通过getFont()询问标签字体返回:DejaVu Sans)
当我用JAVA 7启动程序时,中文字符显示正确!
(通过getFont()询问标签字体返回:DejaVu Sans)

Windows(8.1):
当我用JAVA 6启动程序时,中文字符显示正确!
(通过getFont()询问标签字体返回:SansSerif)
当我用JAVA 7启动程序时,中文字符显示正确!
(通过getFont()询问标签字体返回:SansSerif)

$ JAVA_HOME/lib/fonts,(似乎用作fallback-font)两个java版本(6 + 7)都包含相同的字体.(在两个系统上)
字体文件具有相同的大小(Java6 + Java7),fontconfig.properties.src也是相同的.

当我直接询问Label(通过getFont())时,它在Windows(8.1)上返回"SansSerif",在我的Kubuntu(14.04)上返回"DejaVu Sans".
(见截图)

使用JAVA 6在Linux上启动:
在此输入图像描述

使用JAVA 7在Linux上启动:
在此输入图像描述

Windows上的"SansSerif"正确显示字符,但使用了哪些SansSerif-Font?MS SansSerif(名称中唯一一个带有SansSerif的字体)没有所有这些中文字符.

编辑:
与DejaVuSans相同.
看起来DejaVu Sans没有中文字符!(但是,显示它们!)

编辑2:
我尝试了安德鲁发布的代码(请参阅:如何确定2种字体是否具有等效的字形?),但是使用中文示例文本,
这是结果:

使用JAVA 6在Linux上启动:
在此输入图像描述

使用JAVA 7在Linux上启动:
在此输入图像描述

编辑3:
正如所要求的那样,这里是我测试过的字符串:

String s = "\u6253\u5370\u8FC7\u671F\u8BC1\u4E66\u8BB0\u5F55"; //means: ????????
JOptionPane.showMessageDialog(null, s);
Run Code Online (Sandbox Code Playgroud)

问题是:
实际使用了哪种字体(在系统上)以及如何找到?
提前致谢!

Ben*_*Ben 5

这是我自己的问题的答案.

我做了一些调查:
似乎是,对于某些类型的语言(字符),使用了特殊的配置.

支持Linux和Solaris 11字体
从历史上看,JDK的逻辑字体是在fontconfig.properties文件中静态指定的.但是,在Linux的各种实现中,字体的存在并不一致.因此,如果没有自定义文件,则不会呈现亚洲 (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文件,我发现了以下内容(仅限于重要部分):


#Component Font Mappings allfonts.chinese-cn-iso10646 = -arphic-ar pling cn-light-r-normal-- - %d- - -c- -iso10646-1


#Font 文件名filename.-arphic-ar_pl_uming_ cn -light -r-normal-- - %d- - -c- -iso10646-1 = /usr/share/fonts/truetype/arphic/uming.ttc

#Search Sequences
sequence.allfonts = latin-1
sequence.allfonts.UTF-8.zh.CN = latin-1-cjk,chinese-cn-iso10646
sequence.allfonts.UTF-8.zh.TW = latin-1-cjk,chinese-tw-iso10646
sequence.allfonts.UTF-8. zh.HK =拉丁-1- CJK,中国-HK-ISO10646

当默认字体无法显示请求的字符时,应使用此指定的字体(此处为:uming.ttc).
之后,我检查了/usr/share/fonts/truetype/arphic/uming.ttc的存在.
这个字体/文件存在!
(我查看了3个不同的Ubuntu安装!)

我不知道为什么它没有安装(但仍然在java fontconfig中使用),但执行后(在不同的PC上,但有相同的问题):

  sudo apt-get install fonts-arphic-uming
Run Code Online (Sandbox Code Playgroud)

安装缺少字体,我再次测试(用JAVA 6):

在此输入图像描述

现在一切似乎都还可以.

(我认为nims的答案是朝着类似的方向发展的,但它(在我看来)太宽泛了.而且,java并不真正混合匹配字体.)