首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unicode字符不呈现在Swing中,实际使用的字体是什么?

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

Stack Overflow用户
提问于 2014-09-04 10:30:25
回答 2查看 4.8K关注 0票数 4

在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

在这里,我测试过的字符串:

代码语言:javascript
复制
String s = "\u6253\u5370\u8FC7\u671F\u8BC1\u4E66\u8BB0\u5F55"; //means: 打印过期证书记录
JOptionPane.showMessageDialog(null, s);

的问题是:

哪一种字体(在系统上)是真正使用的,我如何找出?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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上,但有相同的问题):

代码语言:javascript
复制
  sudo apt-get install fonts-arphic-uming

为了安装缺少的字体,我再次进行了测试(使用Java6):

现在一切似乎都好起来了。

(我认为nims的答案也有类似的方向,但它(在我看来)太broadly.Further了,java并不真正将混合匹配字体。

票数 5
EN

Stack Overflow用户

发布于 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而不关心)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25663165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档