获取异常FontFormatException不支持的sfnt resources / fonts / OpenSansEmoji.ttf

时间:2015-02-25 05:19:21

标签: java fonts emoji true-type-fonts opentype

我有资源/字体文件夹中的OpenSansEmoji.ttf和其他字体,如Proxima Nova Regular.otf,对于Proxima Nova Regular.otf / Proxima Nova Alt Light.ttf它没有给我异常,也没有给OpenSansEmoji.otf但是对于OpenSansEmoji.ttf它给了我以下异常我该怎么办?

 Feb  25, 2015 10:37:31 AM java2d.utils.FontUtils getFont
    SEVERE: null
    java.awt.FontFormatException: Unsupported sfnt resources/fonts/OpenSansEmoji.ttf
        at sun.font.TrueTypeFont.init(TrueTypeFont.java:522)
        at sun.font.TrueTypeFont.<init>(TrueTypeFont.java:191)
        at sun.font.SunFontManager.createFont2D(SunFontManager.java:2460)
        at java.awt.Font.<init>(Font.java:614)
        at java.awt.Font.createFont(Font.java:1023)
        at java2d.utils.FontUtils.getFont(FontUtils.java:53)
        at java2d.CrushCard.drawMessageString(CrushCard.java:311)
        at java2d.CrushCard.createCrushCard(CrushCard.java:134)
        at java2d.Java2D.main(Java2D.java:43)

我的代码在这里

  try {
            FontUtils.registerFonts(fonts);
        } catch (IOException | FontFormatException ex) {
            Logger.getLogger(Java2D.class.getName()).log(Level.SEVERE, null, ex);
        }



  public static void registerFonts(List<String> paths) throws IOException, FontFormatException {

        for (String path : paths) {
            String fName = "resources/fonts/" + path;
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fName)));
        }
    }

1 个答案:

答案 0 :(得分:6)

根据维基百科,http://en.wikipedia.org/wiki/SFNT是字体的容器格式,由TrueType等使用。但是,Java不支持所有SFNT字体,仅支持TrueType。

来自sun.font.TrueTypeFont javadoc:

  

TrueTypeFont不称为SFntFont,因为它不会处理可能存放在这种字体文件中的所有类型。

基本上这意味着你的字体虽然以.ttf文件结尾,但实际上并不是TrueType,你也不能使用它。它可能是一个OpenTypeFont,Java不支持它。你可以尝试转换字体;谷歌显示了许多可能性。