Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Unicode字符未在Swing中呈现,实际使用的字体是什么?_Java_Swing_Unicode_Fonts - Fatal编程技术网

Java Unicode字符未在Swing中呈现,实际使用的字体是什么?

Java Unicode字符未在Swing中呈现,实际使用的字体是什么?,java,swing,unicode,fonts,Java,Swing,Unicode,Fonts,我在swing应用程序中显示unicode字符时遇到问题。 我认为问题在于使用的字体不包含适合中文的字符。 (仅显示空框) 以下是关于我的问题的更多信息(我做了一些调查): Linux(Kubuntu 14.04): 当我用JAVA 6启动程序时,不会显示汉字(仅空框)。 (通过getFont()询问标签字体返回:DejaVu Sans) 当我用JAVA 7启动我的程序时,汉字显示正确 (通过getFont()询问标签字体返回:DejaVu Sans) Windows(8.1): 当我用JAVA

我在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/font(似乎用作备用字体)两个JAVA版本(6+7)包含相同的字体。(在两种系统上)
字体文件大小相同(Java6+Java7),fontconfig.properties.src也相同。

当我直接询问标签时(通过getFont()),它在Windows(8.1)上返回“SansSerif”,在Kubuntu(14.04)上返回“DejaVu Sans”。
(参见屏幕截图)

使用JAVA 6在Linux上启动:

使用JAVA 7在Linux上启动:

Windows上的“SansSerif”正确显示字符,但使用哪种SansSerif字体? MS SansSerif(名称中唯一带有SansSerif的字体)没有所有这些汉字

编辑
与DejaVuSans相同。
看起来DejaVu Sans没有汉字!(但是,会显示它们!)

编辑2
我尝试了Andrew发布的代码(见:),但使用了中文示例文本
这就是结果:

使用JAVA 6在Linux上启动:

使用JAVA 7在Linux上启动:

编辑3
根据要求,这里是我测试过的字符串:

String s = "\u6253\u5370\u8FC7\u671F\u8BC1\u4E66\u8BB0\u5F55"; //means: 打印过期证书记录
JOptionPane.showMessageDialog(null, s);
问题是:
(系统上)真正使用的是哪种字体?我怎样才能知道呢?

提前谢谢

Java 7在Linux上使用fontconfig,因此它知道在字体缺少字形时如何回退。要检查fontconfig在给定系统上使用的回退,可以使用fc-*命令(fc match等)

但是,您的jre除了系统规则(fontconfig*xml)之外,还可能包含私有回退规则

您不能在java 6上模拟这种行为,因为fontconfig不是一个简单的优先级列表,在该列表中,在任何给定时间都使用单个字体。它将根据要显示的文本的需要和应用程序表达的首选项(字体模式)混合和匹配字体


如果有一种字体能够显示系统上的文本,则启用fontconfig的软件将始终工作。不使用fontconfig的应用程序将在应用程序中硬编码的字体名称与可用字体名称不匹配时失败。Linux系统上安装的字体有很大的差异,你不能期望一个安装上的字体也会出现在另一个安装上(正是因为所有现代Linux应用程序都使用fontconfig,不在乎)。

这是我自己问题的答案

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

对Linux和Solaris 11字体的支持历史上,JDK的逻辑字体是在fontconfig.properties中静态指定的 文件然而,在Linux的各种实现上,没有 字体一致性。因此,如果没有自定义文件,Asian (CJK)文本等将不会呈现。在JDK 7、Linux和 Solaris 11,没有自定义的fontconfig.properties文件 对于操作系统版本,默认行为是使用系统 libfontconfig选择用于逻辑字体的字体。在这个 在这种情况下,逻辑字体将反映Gnome/KDE使用的字体 使用相同平台库的桌面应用程序

这就是我在这里发现的:

这意味着首先,在Java 6和Java 7中选择正确的字体是有区别的。
接下来,我检查了我的(java 6)fontconfig文件,发现以下内容(仅限于重要部分):

#组件字体映射
所有字体。中文-cn-iso10646

#字体文件名
filename.-arphic-ar\u pl\u umning\ustrong>cn
-light-r-normal---%d--c--iso10646-1=/usr/share/fonts/truetype/arphic/uming.ttc

#搜索序列
sequence.allfonts=latin-1
sequence.allfonts.UTF-8.zh.CN=拉丁语-1-cjk,中文-CN-iso10646
sequence.allfonts.UTF-8.zh.TW=latin-1-cjk,chinese-TW-iso10646
sequence.allfonts.UTF-8.zh.HK=latin-1-cjk,chinese-HK-iso10646

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

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

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

现在一切似乎都好了

(我认为nims的答案是类似的,但(在我看来)太宽泛了。此外,java并没有真正的混合匹配
  sudo apt-get install fonts-arphic-uming