diff --git a/src/main/java/org/verapdf/pd/font/PDFont.java b/src/main/java/org/verapdf/pd/font/PDFont.java index 4a82d297..271b1dd6 100644 --- a/src/main/java/org/verapdf/pd/font/PDFont.java +++ b/src/main/java/org/verapdf/pd/font/PDFont.java @@ -334,6 +334,10 @@ public String toUnicode(int code) { return cMapToUnicode(code); } + public String toUnicode(int code, boolean isStrict) { + return toUnicode(code); + } + /** * Gets toUnicode value just from toUnicode cMap. * diff --git a/src/main/java/org/verapdf/pd/font/PDSimpleFont.java b/src/main/java/org/verapdf/pd/font/PDSimpleFont.java index a93de3ad..5774530c 100644 --- a/src/main/java/org/verapdf/pd/font/PDSimpleFont.java +++ b/src/main/java/org/verapdf/pd/font/PDSimpleFont.java @@ -55,7 +55,11 @@ public PDSimpleFont(COSDictionary dictionary) { */ @Override public String toUnicode(int code) { + return toUnicode(code, true); + } + @Override + public String toUnicode(int code, boolean isStrict) { String unicodeString = super.toUnicode(code); if (unicodeString != null) { return unicodeString; @@ -70,14 +74,23 @@ public String toUnicode(int code) { glyphName = fontProgram.getGlyphName(code); } if (glyphName != null) { - AdobeGlyphList.AGLUnicode unicode = AdobeGlyphList.get(glyphName); - if (unicode != AdobeGlyphList.empty()) { - return unicode.getUnicodeString(); - } - LOGGER.log(Level.FINE, "Cannot find glyph " + glyphName + " in Adobe Glyph List."); - if (ZapfDingbats.hasGlyphName(glyphName) || SymbolSet.hasGlyphName(glyphName)) { - return " "; // indicates that toUnicode should not be checked. + if (isStrict) { + AdobeGlyphList.AGLUnicode unicode = AdobeGlyphList.get(glyphName); + if (unicode != AdobeGlyphList.empty()) { + return unicode.getUnicodeString(); + } + LOGGER.log(Level.FINE, "Cannot find glyph " + glyphName + " in Adobe Glyph List."); + if (ZapfDingbats.hasGlyphName(glyphName) || SymbolSet.hasGlyphName(glyphName)) { + return " "; // indicates that toUnicode should not be checked. + } + } else { + String mapped = AdobeGlyphList.mapGlyphNameToUnicode(glyphName); + if (!mapped.isEmpty()) { + return mapped; + } + LOGGER.log(Level.FINE, "Cannot find glyph " + glyphName + " in Adobe Glyph List, Zapf Dingbats, or as uni/u name."); } + return null; } LOGGER.log(Level.FINE, "Cannot find encoding for glyph with code " + code + " in font " + this.getName()); diff --git a/src/main/java/org/verapdf/pd/font/truetype/AdobeGlyphList.java b/src/main/java/org/verapdf/pd/font/truetype/AdobeGlyphList.java index 8019f97e..f8c88471 100644 --- a/src/main/java/org/verapdf/pd/font/truetype/AdobeGlyphList.java +++ b/src/main/java/org/verapdf/pd/font/truetype/AdobeGlyphList.java @@ -22,6 +22,7 @@ import org.verapdf.io.SeekableInputStream; +import org.verapdf.pd.font.type1.ZapfDingbats; import java.io.File; import java.io.IOException; @@ -161,4 +162,98 @@ public String getUnicodeString() { return new String(res, 0, res.length); } } + + public static String mapGlyphNameToUnicode(String glyphName) { + int dot = glyphName.indexOf('.'); + if (dot >= 0) { + glyphName = glyphName.substring(0, dot); + } + + String[] components = glyphName.split("_", -1); + StringBuilder result = new StringBuilder(); + for (String comp : components) { + String mapped = mapComponent(comp); + if (mapped.isEmpty()) { + return ""; + } + result.append(mapped); + } + return result.toString(); + } + + private static String mapComponent(String component) { + if (ZapfDingbats.hasGlyphName(component)) { + return ZapfDingbats.toUnicode(component); + } + + AdobeGlyphList.AGLUnicode unicode = AdobeGlyphList.get(component); + if (unicode != AdobeGlyphList.empty()) { + return unicode.getUnicodeString(); + } + + if (component.startsWith("uni") && component.length() > 3) { + String result = parseUniComponent(component); + if (result != null) { + return result; + } + } + + if (component.startsWith("u") && component.length() > 1) { + String result = parseUComponent(component); + if (result != null) { + return result; + } + } + + return ""; + } + + private static String parseUniComponent(String component) { + String hex = component.substring(3); + if (hex.isEmpty() || hex.length() % 4 != 0) { + return null; + } + StringBuilder sb = new StringBuilder(hex.length() / 4); + for (int i = 0; i < hex.length(); i += 4) { + String group = hex.substring(i, i + 4); + if (isNotValidHex(hex)) { + return null; + } + int cp = Integer.parseInt(group, 16); + if (!((cp >= 0x0000 && cp <= 0xD7FF) || (cp >= 0xE000 && cp <= 0xFFFF))) { + return null; + } + sb.append((char) cp); + } + return sb.toString(); + } + + private static String parseUComponent(String component) { + String hex = component.substring(1); + if (hex.length() < 4 || hex.length() > 6) { + return null; + } + if (isNotValidHex(hex)) { + return null; + } + int cp = Integer.parseInt(hex, 16); + if (!((cp >= 0x0000 && cp <= 0xD7FF) || (cp >= 0xE000 && cp <= 0x10FFFF))) { + return null; + } + if (cp <= 0xFFFF) { + return String.valueOf((char) cp); + } else { + return new String(Character.toChars(cp)); + } + } + + private static boolean isNotValidHex(String hex) { + for (int i = 0; i < hex.length(); i++) { + char c = hex.charAt(i); + if (!((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))) { + return true; + } + } + return false; + } } diff --git a/src/main/java/org/verapdf/pd/font/type1/ZapfDingbats.java b/src/main/java/org/verapdf/pd/font/type1/ZapfDingbats.java index 44087c6e..ce4dde09 100644 --- a/src/main/java/org/verapdf/pd/font/type1/ZapfDingbats.java +++ b/src/main/java/org/verapdf/pd/font/type1/ZapfDingbats.java @@ -20,222 +20,225 @@ */ package org.verapdf.pd.font.type1; -import java.util.Set; -import java.util.TreeSet; +import java.util.HashMap; +import java.util.Map; /** * @author Sergey Shemyakov */ public class ZapfDingbats { - private static final Set glyphNames = new TreeSet<>(); + private static final Map glyphToUnicodeMap = new HashMap<>(); static { - glyphNames.add("a100"); - glyphNames.add("a101"); - glyphNames.add("a102"); - glyphNames.add("a103"); - glyphNames.add("a104"); - glyphNames.add("a105"); - glyphNames.add("a106"); - glyphNames.add("a107"); - glyphNames.add("a108"); - glyphNames.add("a109"); - glyphNames.add("a10"); - glyphNames.add("a110"); - glyphNames.add("a111"); - glyphNames.add("a112"); - glyphNames.add("a117"); - glyphNames.add("a118"); - glyphNames.add("a119"); - glyphNames.add("a11"); - glyphNames.add("a120"); - glyphNames.add("a121"); - glyphNames.add("a122"); - glyphNames.add("a123"); - glyphNames.add("a124"); - glyphNames.add("a125"); - glyphNames.add("a126"); - glyphNames.add("a127"); - glyphNames.add("a128"); - glyphNames.add("a129"); - glyphNames.add("a12"); - glyphNames.add("a130"); - glyphNames.add("a131"); - glyphNames.add("a132"); - glyphNames.add("a133"); - glyphNames.add("a134"); - glyphNames.add("a135"); - glyphNames.add("a136"); - glyphNames.add("a137"); - glyphNames.add("a138"); - glyphNames.add("a139"); - glyphNames.add("a13"); - glyphNames.add("a140"); - glyphNames.add("a141"); - glyphNames.add("a142"); - glyphNames.add("a143"); - glyphNames.add("a144"); - glyphNames.add("a145"); - glyphNames.add("a146"); - glyphNames.add("a147"); - glyphNames.add("a148"); - glyphNames.add("a149"); - glyphNames.add("a14"); - glyphNames.add("a150"); - glyphNames.add("a151"); - glyphNames.add("a152"); - glyphNames.add("a153"); - glyphNames.add("a154"); - glyphNames.add("a155"); - glyphNames.add("a156"); - glyphNames.add("a157"); - glyphNames.add("a158"); - glyphNames.add("a159"); - glyphNames.add("a15"); - glyphNames.add("a160"); - glyphNames.add("a161"); - glyphNames.add("a162"); - glyphNames.add("a163"); - glyphNames.add("a164"); - glyphNames.add("a165"); - glyphNames.add("a166"); - glyphNames.add("a167"); - glyphNames.add("a168"); - glyphNames.add("a169"); - glyphNames.add("a16"); - glyphNames.add("a170"); - glyphNames.add("a171"); - glyphNames.add("a172"); - glyphNames.add("a173"); - glyphNames.add("a174"); - glyphNames.add("a175"); - glyphNames.add("a176"); - glyphNames.add("a177"); - glyphNames.add("a178"); - glyphNames.add("a179"); - glyphNames.add("a17"); - glyphNames.add("a180"); - glyphNames.add("a181"); - glyphNames.add("a182"); - glyphNames.add("a183"); - glyphNames.add("a184"); - glyphNames.add("a185"); - glyphNames.add("a186"); - glyphNames.add("a187"); - glyphNames.add("a188"); - glyphNames.add("a189"); - glyphNames.add("a18"); - glyphNames.add("a190"); - glyphNames.add("a191"); - glyphNames.add("a192"); - glyphNames.add("a193"); - glyphNames.add("a194"); - glyphNames.add("a195"); - glyphNames.add("a196"); - glyphNames.add("a197"); - glyphNames.add("a198"); - glyphNames.add("a199"); - glyphNames.add("a19"); - glyphNames.add("a1"); - glyphNames.add("a200"); - glyphNames.add("a201"); - glyphNames.add("a202"); - glyphNames.add("a203"); - glyphNames.add("a204"); - glyphNames.add("a205"); - glyphNames.add("a206"); - glyphNames.add("a20"); - glyphNames.add("a21"); - glyphNames.add("a22"); - glyphNames.add("a23"); - glyphNames.add("a24"); - glyphNames.add("a25"); - glyphNames.add("a26"); - glyphNames.add("a27"); - glyphNames.add("a28"); - glyphNames.add("a29"); - glyphNames.add("a2"); - glyphNames.add("a30"); - glyphNames.add("a31"); - glyphNames.add("a32"); - glyphNames.add("a33"); - glyphNames.add("a34"); - glyphNames.add("a35"); - glyphNames.add("a36"); - glyphNames.add("a37"); - glyphNames.add("a38"); - glyphNames.add("a39"); - glyphNames.add("a3"); - glyphNames.add("a40"); - glyphNames.add("a41"); - glyphNames.add("a42"); - glyphNames.add("a43"); - glyphNames.add("a44"); - glyphNames.add("a45"); - glyphNames.add("a46"); - glyphNames.add("a47"); - glyphNames.add("a48"); - glyphNames.add("a49"); - glyphNames.add("a4"); - glyphNames.add("a50"); - glyphNames.add("a51"); - glyphNames.add("a52"); - glyphNames.add("a53"); - glyphNames.add("a54"); - glyphNames.add("a55"); - glyphNames.add("a56"); - glyphNames.add("a57"); - glyphNames.add("a58"); - glyphNames.add("a59"); - glyphNames.add("a5"); - glyphNames.add("a60"); - glyphNames.add("a61"); - glyphNames.add("a62"); - glyphNames.add("a63"); - glyphNames.add("a64"); - glyphNames.add("a65"); - glyphNames.add("a66"); - glyphNames.add("a67"); - glyphNames.add("a68"); - glyphNames.add("a69"); - glyphNames.add("a6"); - glyphNames.add("a70"); - glyphNames.add("a71"); - glyphNames.add("a72"); - glyphNames.add("a73"); - glyphNames.add("a74"); - glyphNames.add("a75"); - glyphNames.add("a76"); - glyphNames.add("a77"); - glyphNames.add("a78"); - glyphNames.add("a79"); - glyphNames.add("a7"); - glyphNames.add("a81"); - glyphNames.add("a82"); - glyphNames.add("a83"); - glyphNames.add("a84"); - glyphNames.add("a85"); - glyphNames.add("a86"); - glyphNames.add("a87"); - glyphNames.add("a88"); - glyphNames.add("a89"); - glyphNames.add("a8"); - glyphNames.add("a90"); - glyphNames.add("a91"); - glyphNames.add("a92"); - glyphNames.add("a93"); - glyphNames.add("a94"); - glyphNames.add("a95"); - glyphNames.add("a96"); - glyphNames.add("a97"); - glyphNames.add("a98"); - glyphNames.add("a99"); - glyphNames.add("a9"); + glyphToUnicodeMap.put("a1", "\u2701"); + glyphToUnicodeMap.put("a2", "\u2702"); + glyphToUnicodeMap.put("a3", "\u2704"); + glyphToUnicodeMap.put("a4", "\u260E"); + glyphToUnicodeMap.put("a5", "\u2706"); + glyphToUnicodeMap.put("a6", "\u271D"); + glyphToUnicodeMap.put("a7", "\u271E"); + glyphToUnicodeMap.put("a8", "\u271F"); + glyphToUnicodeMap.put("a9", "\u2720"); + glyphToUnicodeMap.put("a10", "\u2721"); + glyphToUnicodeMap.put("a11", "\u261B"); + glyphToUnicodeMap.put("a12", "\u261E"); + glyphToUnicodeMap.put("a13", "\u270C"); + glyphToUnicodeMap.put("a14", "\u270D"); + glyphToUnicodeMap.put("a15", "\u270E"); + glyphToUnicodeMap.put("a16", "\u270F"); + glyphToUnicodeMap.put("a17", "\u2711"); + glyphToUnicodeMap.put("a18", "\u2712"); + glyphToUnicodeMap.put("a19", "\u2713"); + glyphToUnicodeMap.put("a20", "\u2714"); + glyphToUnicodeMap.put("a21", "\u2715"); + glyphToUnicodeMap.put("a22", "\u2716"); + glyphToUnicodeMap.put("a23", "\u2717"); + glyphToUnicodeMap.put("a24", "\u2718"); + glyphToUnicodeMap.put("a25", "\u2719"); + glyphToUnicodeMap.put("a26", "\u271A"); + glyphToUnicodeMap.put("a27", "\u271B"); + glyphToUnicodeMap.put("a28", "\u271C"); + glyphToUnicodeMap.put("a29", "\u2722"); + glyphToUnicodeMap.put("a30", "\u2723"); + glyphToUnicodeMap.put("a31", "\u2724"); + glyphToUnicodeMap.put("a32", "\u2725"); + glyphToUnicodeMap.put("a33", "\u2726"); + glyphToUnicodeMap.put("a34", "\u2727"); + glyphToUnicodeMap.put("a35", "\u2605"); + glyphToUnicodeMap.put("a36", "\u2729"); + glyphToUnicodeMap.put("a37", "\u272A"); + glyphToUnicodeMap.put("a38", "\u272B"); + glyphToUnicodeMap.put("a39", "\u272C"); + glyphToUnicodeMap.put("a40", "\u272D"); + glyphToUnicodeMap.put("a41", "\u272E"); + glyphToUnicodeMap.put("a42", "\u272F"); + glyphToUnicodeMap.put("a43", "\u2730"); + glyphToUnicodeMap.put("a44", "\u2731"); + glyphToUnicodeMap.put("a45", "\u2732"); + glyphToUnicodeMap.put("a46", "\u2733"); + glyphToUnicodeMap.put("a47", "\u2734"); + glyphToUnicodeMap.put("a48", "\u2735"); + glyphToUnicodeMap.put("a49", "\u2736"); + glyphToUnicodeMap.put("a50", "\u2737"); + glyphToUnicodeMap.put("a51", "\u2738"); + glyphToUnicodeMap.put("a52", "\u2739"); + glyphToUnicodeMap.put("a53", "\u273A"); + glyphToUnicodeMap.put("a54", "\u273B"); + glyphToUnicodeMap.put("a55", "\u273C"); + glyphToUnicodeMap.put("a56", "\u273D"); + glyphToUnicodeMap.put("a57", "\u273E"); + glyphToUnicodeMap.put("a58", "\u273F"); + glyphToUnicodeMap.put("a59", "\u2740"); + glyphToUnicodeMap.put("a60", "\u2741"); + glyphToUnicodeMap.put("a61", "\u2742"); + glyphToUnicodeMap.put("a62", "\u2743"); + glyphToUnicodeMap.put("a63", "\u2744"); + glyphToUnicodeMap.put("a64", "\u2745"); + glyphToUnicodeMap.put("a65", "\u2746"); + glyphToUnicodeMap.put("a66", "\u2747"); + glyphToUnicodeMap.put("a67", "\u2748"); + glyphToUnicodeMap.put("a68", "\u2749"); + glyphToUnicodeMap.put("a69", "\u274A"); + glyphToUnicodeMap.put("a70", "\u274B"); + glyphToUnicodeMap.put("a71", "\u25CF"); + glyphToUnicodeMap.put("a72", "\u274D"); + glyphToUnicodeMap.put("a73", "\u25A0"); + glyphToUnicodeMap.put("a74", "\u274F"); + glyphToUnicodeMap.put("a75", "\u2751"); + glyphToUnicodeMap.put("a76", "\u25B2"); + glyphToUnicodeMap.put("a77", "\u25BC"); + glyphToUnicodeMap.put("a78", "\u25C6"); + glyphToUnicodeMap.put("a79", "\u2756"); + glyphToUnicodeMap.put("a81", "\u25D7"); + glyphToUnicodeMap.put("a82", "\u2758"); + glyphToUnicodeMap.put("a83", "\u2759"); + glyphToUnicodeMap.put("a84", "\u275A"); + glyphToUnicodeMap.put("a85", "\u276F"); + glyphToUnicodeMap.put("a86", "\u2771"); + glyphToUnicodeMap.put("a87", "\u2772"); + glyphToUnicodeMap.put("a88", "\u2773"); + glyphToUnicodeMap.put("a89", "\u2768"); + glyphToUnicodeMap.put("a90", "\u2769"); + glyphToUnicodeMap.put("a91", "\u276C"); + glyphToUnicodeMap.put("a92", "\u276D"); + glyphToUnicodeMap.put("a93", "\u276A"); + glyphToUnicodeMap.put("a94", "\u276B"); + glyphToUnicodeMap.put("a95", "\u2774"); + glyphToUnicodeMap.put("a96", "\u2775"); + glyphToUnicodeMap.put("a97", "\u275B"); + glyphToUnicodeMap.put("a98", "\u275C"); + glyphToUnicodeMap.put("a99", "\u275D"); + glyphToUnicodeMap.put("a100", "\u275E"); + glyphToUnicodeMap.put("a101", "\u2761"); + glyphToUnicodeMap.put("a102", "\u2762"); + glyphToUnicodeMap.put("a103", "\u2763"); + glyphToUnicodeMap.put("a104", "\u2764"); + glyphToUnicodeMap.put("a105", "\u2710"); + glyphToUnicodeMap.put("a106", "\u2765"); + glyphToUnicodeMap.put("a107", "\u2766"); + glyphToUnicodeMap.put("a108", "\u2767"); + glyphToUnicodeMap.put("a109", "\u2660"); + glyphToUnicodeMap.put("a110", "\u2665"); + glyphToUnicodeMap.put("a111", "\u2666"); + glyphToUnicodeMap.put("a112", "\u2663"); + glyphToUnicodeMap.put("a117", "\u2709"); + glyphToUnicodeMap.put("a118", "\u2708"); + glyphToUnicodeMap.put("a119", "\u2707"); + glyphToUnicodeMap.put("a120", "\u2460"); + glyphToUnicodeMap.put("a121", "\u2461"); + glyphToUnicodeMap.put("a122", "\u2462"); + glyphToUnicodeMap.put("a123", "\u2463"); + glyphToUnicodeMap.put("a124", "\u2464"); + glyphToUnicodeMap.put("a125", "\u2465"); + glyphToUnicodeMap.put("a126", "\u2466"); + glyphToUnicodeMap.put("a127", "\u2467"); + glyphToUnicodeMap.put("a128", "\u2468"); + glyphToUnicodeMap.put("a129", "\u2469"); + glyphToUnicodeMap.put("a130", "\u2776"); + glyphToUnicodeMap.put("a131", "\u2777"); + glyphToUnicodeMap.put("a132", "\u2778"); + glyphToUnicodeMap.put("a133", "\u2779"); + glyphToUnicodeMap.put("a134", "\u277A"); + glyphToUnicodeMap.put("a135", "\u277B"); + glyphToUnicodeMap.put("a136", "\u277C"); + glyphToUnicodeMap.put("a137", "\u277D"); + glyphToUnicodeMap.put("a138", "\u277E"); + glyphToUnicodeMap.put("a139", "\u277F"); + glyphToUnicodeMap.put("a140", "\u2780"); + glyphToUnicodeMap.put("a141", "\u2781"); + glyphToUnicodeMap.put("a142", "\u2782"); + glyphToUnicodeMap.put("a143", "\u2783"); + glyphToUnicodeMap.put("a144", "\u2784"); + glyphToUnicodeMap.put("a145", "\u2785"); + glyphToUnicodeMap.put("a146", "\u2786"); + glyphToUnicodeMap.put("a147", "\u2787"); + glyphToUnicodeMap.put("a148", "\u2788"); + glyphToUnicodeMap.put("a149", "\u2789"); + glyphToUnicodeMap.put("a150", "\u278A"); + glyphToUnicodeMap.put("a151", "\u278B"); + glyphToUnicodeMap.put("a152", "\u278C"); + glyphToUnicodeMap.put("a153", "\u278D"); + glyphToUnicodeMap.put("a154", "\u278E"); + glyphToUnicodeMap.put("a155", "\u278F"); + glyphToUnicodeMap.put("a156", "\u2790"); + glyphToUnicodeMap.put("a157", "\u2791"); + glyphToUnicodeMap.put("a158", "\u2792"); + glyphToUnicodeMap.put("a159", "\u2793"); + glyphToUnicodeMap.put("a160", "\u2794"); + glyphToUnicodeMap.put("a161", "\u2192"); + glyphToUnicodeMap.put("a162", "\u27A3"); + glyphToUnicodeMap.put("a163", "\u2194"); + glyphToUnicodeMap.put("a164", "\u2195"); + glyphToUnicodeMap.put("a165", "\u2799"); + glyphToUnicodeMap.put("a166", "\u279B"); + glyphToUnicodeMap.put("a167", "\u279C"); + glyphToUnicodeMap.put("a168", "\u279D"); + glyphToUnicodeMap.put("a169", "\u279E"); + glyphToUnicodeMap.put("a170", "\u279F"); + glyphToUnicodeMap.put("a171", "\u27A0"); + glyphToUnicodeMap.put("a172", "\u27A1"); + glyphToUnicodeMap.put("a173", "\u27A2"); + glyphToUnicodeMap.put("a174", "\u27A4"); + glyphToUnicodeMap.put("a175", "\u27A5"); + glyphToUnicodeMap.put("a176", "\u27A6"); + glyphToUnicodeMap.put("a177", "\u27A7"); + glyphToUnicodeMap.put("a178", "\u27A8"); + glyphToUnicodeMap.put("a179", "\u27A9"); + glyphToUnicodeMap.put("a180", "\u27AB"); + glyphToUnicodeMap.put("a181", "\u27AD"); + glyphToUnicodeMap.put("a182", "\u27AF"); + glyphToUnicodeMap.put("a183", "\u27B2"); + glyphToUnicodeMap.put("a184", "\u27B3"); + glyphToUnicodeMap.put("a185", "\u27B5"); + glyphToUnicodeMap.put("a186", "\u27B8"); + glyphToUnicodeMap.put("a187", "\u27BA"); + glyphToUnicodeMap.put("a188", "\u27BB"); + glyphToUnicodeMap.put("a189", "\u27BC"); + glyphToUnicodeMap.put("a190", "\u27BD"); + glyphToUnicodeMap.put("a191", "\u27BE"); + glyphToUnicodeMap.put("a192", "\u279A"); + glyphToUnicodeMap.put("a193", "\u27AA"); + glyphToUnicodeMap.put("a194", "\u27B6"); + glyphToUnicodeMap.put("a195", "\u27B9"); + glyphToUnicodeMap.put("a196", "\u2798"); + glyphToUnicodeMap.put("a197", "\u27B4"); + glyphToUnicodeMap.put("a198", "\u27B7"); + glyphToUnicodeMap.put("a199", "\u27AC"); + glyphToUnicodeMap.put("a200", "\u27AE"); + glyphToUnicodeMap.put("a201", "\u27B1"); + glyphToUnicodeMap.put("a202", "\u2703"); + glyphToUnicodeMap.put("a203", "\u2750"); + glyphToUnicodeMap.put("a204", "\u2752"); + glyphToUnicodeMap.put("a205", "\u276E"); + glyphToUnicodeMap.put("a206", "\u2770"); } public static boolean hasGlyphName(String name) { - return glyphNames.contains(name); + return glyphToUnicodeMap.containsKey(name); } + public static String toUnicode(String glyphName) { + return glyphToUnicodeMap.get(glyphName); + } }