java - Font.getNumGlyphs() 返回的数字

标签 java unicode fonts awt

Font.getNumGlyphs() 返回的数字实际上代表什么?

docs. 状态:

Returns the number of glyphs in this Font. Glyph codes for this Font range from 0 to getNumGlyphs() - 1.

我认为它代表了 0 到 Character.MAX_CODE_POINT 之间的代码点的数量,其中 Font.canDisplay(codePoint) 返回了 true。但下面代码的输出表明情况并非如此。

代码

注意:这里检查 200 多种字体的 100 万多个代码点(countGlyphs 方法)需要近 30 秒。运行时要有耐心。

import java.awt.*;
import java.util.Date;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

class FontGlyphCheck {

    public static int countGlyphs(Font f) {
        int count = 0;
        for (int ii = 0; ii < Character.MAX_CODE_POINT; ii++) {
            if (f.canDisplay(ii)) {
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(new Date());
        GraphicsEnvironment ge =
                GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] fontNameArray = ge.getAvailableFontFamilyNames();

        final String[] names = {"Name", "Number Glyphs", "Count Glyphs"};
        final Object[][] values =
                new Object[fontNameArray.length][names.length];
        for (int ii = 0; ii < fontNameArray.length; ii++) {
            Font f = new Font(fontNameArray[ii], Font.PLAIN, 16);
            values[ii][0] = fontNameArray[ii];
            values[ii][1] = new Integer(f.getNumGlyphs());
            values[ii][2] = new Integer(countGlyphs(f));
        }
        System.out.println(new Date());
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new BorderLayout());

                DefaultTableModel dtm = new DefaultTableModel(values, names) {

                    @Override
                    public Class<?> getColumnClass(int columnIndex) {
                        if (columnIndex == 0) {
                            return String.class;
                        }
                        return Integer.class;
                    }
                };

                JTable table = new JTable(dtm);
                table.setAutoCreateRowSorter(true);
                gui.add(new JScrollPane(table));

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

输出

此输出来自基于 Windows 7 的 PC。 GUI 表格中显示的第一列被拖到最后一列(为了更好的列对齐),并且行按 getNumGlyphs() 值(输出的第一列)升序排序。

16  33  MS Outlook
41  59  Marlett
46  64  MT Extra
116 131 Bookshelf Symbol 7
192 208 Symbol
204 256 Algerian
208 286 Castellar
211 228 Wingdings 3
220 237 Wingdings 2
226 243 Wingdings
227 243 Webdings
230 250 Elephant
231 190 MS Reference Specialty
232 282 Stencil
241 258 Onyx
242 254 Narkisim
242 254 Miriam
242 254 Levenim MT
242 254 Aharoni
242 261 Modern No. 20
242 261 Footlight MT Light
243 254 Miriam Fixed
243 254 FrankRuehl
243 254 David
243 260 Lucida Handwriting
243 260 Lucida Fax
243 260 Lucida Calligraphy
243 261 Rockwell Extra Bold
243 261 Rockwell
243 261 Palace Script MT
243 261 Gloucester MT Extra Condensed
243 261 Colonna MT
243 261 Centaur
243 261 Brush Script MT
243 261 Broadway
243 261 Bell MT
243 261 Arial Rounded MT Bold
244 256 Rod
244 261 Perpetua Titling MT
244 261 Matura MT Script Capitals
244 261 Imprint MT Shadow
244 261 Engravers MT
244 261 Blackadder ITC
244 261 Bernard MT Condensed
244 262 Poor Richard
244 265 Old English Text MT
244 267 Edwardian Script ITC
245 261 Chiller
245 261 Calisto MT
246 262 Freestyle Script
247 266 Pristina
248 257 Harrington
248 270 Jokerman
249 268 Forte
249 273 Goudy Stout
249 275 Kristen ITC
250 267 Vladimir Script
250 267 Rage Italic
250 267 Kunstler Script
250 267 Eras Medium ITC
250 267 Eras Light ITC
250 267 Eras Demi ITC
250 267 Eras Bold ITC
250 268 Perpetua
251 268 OCR A Extended
251 268 Bodoni MT
251 269 Viner Hand ITC
251 269 Tempus Sans ITC
251 269 Script MT Bold
251 269 Rockwell Condensed
251 269 French Script MT
251 269 Felix Titling
251 269 Curlz MT
251 269 Bradley Hand ITC
252 259 Wide Latin
252 260 Britannic Bold
252 261 Cooper Black
252 268 Bodoni MT Condensed
252 268 Bodoni MT Black
253 261 Copperplate Gothic Light
253 261 Copperplate Gothic Bold
253 268 Gigi
255 262 Parchment
255 262 Papyrus
258 260 Playbill
260 278 Maiandra GD
261 277 Snap ITC
261 277 Juice ITC
261 279 Bodoni MT Poster Compressed
269 261 Baskerville Old Face
269 274 Showcard Gothic
270 260 Vivaldi
270 260 Harlow Solid Italic
270 260 Bauhaus 93
270 261 Goudy Old Style
274 274 Ravie
275 279 Informal Roman
291 274 Magneto
295 315 Gill Sans Ultra Bold
296 315 Gill Sans MT Condensed
297 314 Tw Cen MT Condensed Extra Bold
297 314 Tw Cen MT Condensed
297 314 Tw Cen MT
297 314 Gill Sans Ultra Bold Condensed
297 315 Gill Sans MT Ext Condensed Bold
298 274 Agency FB
300 303 MV Boli
300 315 Gill Sans MT
308 321 Microsoft Tai Le
311 326 Plantagenet Cherokee
317 338 Lao UI
343 350 Microsoft New Tai Lue
350 358 Leelawadee
362 333 LilyUPC
362 333 KodchiangUPC
362 333 JasmineUPC
362 333 IrisUPC
362 333 FreesiaUPC
362 333 EucrosiaUPC
362 333 DilleniaUPC
362 333 CordiaUPC
362 333 Cordia New
362 333 BrowalliaUPC
362 333 Browallia New
362 333 AngsanaUPC
362 333 Angsana New
363 275 Berlin Sans FB
364 274 Berlin Sans FB Demi
381 274 Californian FB
385 274 High Tower Text
395 402 Gisha
397 274 Niagara Solid
397 274 Niagara Engraved
422 321 Vijaya
433 317 Latha
450 370 Estrangelo Edessa
459 326 Raavi
463 348 Kartika
473 484 Simplified Arabic
474 482 Simplified Arabic Fixed
490 402 DokChampa
518 507 Andalus
581 595 Trebuchet MS
587 602 Comic Sans MS
589 574 Traditional Arabic
592 339 Tunga
596 614 Georgia
633 337 Kalinga
634 382 DaunPenh
654 676 Haettenschweiler
660 677 Franklin Gothic Heavy
660 678 Franklin Gothic Book
663 672 Garamond
663 676 Arial Narrow
663 678 Franklin Gothic Medium Cond
663 678 Franklin Gothic Demi Cond
663 681 Franklin Gothic Demi
665 677 Franklin Gothic Medium
666 676 Mistral
666 677 Impact
666 688 Century Gothic
667 664 Lucida Console
669 690 Monotype Corsiva
669 691 Century Schoolbook
669 691 Bookman Old Style
669 691 Book Antiqua
670 406 MoolBoran
670 692 Century
674 680 Arial Black
675 391 Khmer UI
690 687 Segoe Print
706 358 Utsaah
706 358 Kokila
706 358 Aparajita
734 732 Sylfaen
796 724 Gentium Book Basic
796 724 Gentium Basic
816 333 Vrinda
826 352 Iskoola Pota
847 337 Shonar Bangla
864 353 Vani
865 879 Euphemia
872 348 Gautami
885 357 Mangal
951 794 Verdana
1014    1029    OpenSymbol
1028    902 Nyala
1043    709 Microsoft Uighur
1180    780 Candara
1193    1190    MS Reference Sans Serif
1201    780 Corbel
1204    779 Constantia
1326    613 Microsoft PhagsPa
1328    1083    Palatino Linotype
1376    1391    Lucida Sans Typewriter
1402    1415    Lucida Bright
1482    456 Microsoft Himalaya
1484    1286    Ebrima
1491    340 Shruti
1565    1553    Microsoft Yi Baiti
1779    1762    Lucida Sans Unicode
1824    420 Mongolian Baiti
1915    1876    DejaVu Sans Light
1940    627 Segoe Script
2261    989 Sakkal Majalla
2380    2139    Segoe UI Semibold
2380    2139    Segoe UI Light
2584    2307    Arimo
2731    2230    Consolas
2901    2668    Segoe UI
2929    2391    Lucida Sans
2962    1138    Arabic Typesetting
3077    2826    Microsoft Sans Serif
3248    2862    Courier New
3248    87256   Monospaced
3248    87256   DialogInput
3289    3257    DejaVu Sans Mono
3399    3357    DejaVu Serif Condensed
3399    3357    DejaVu Serif
3414    2905    Tahoma
3415    2817    Times New Roman
3415    87191   Serif
3417    2821    Arial
3417    87193   SansSerif
3417    87193   Dialog
3878    2176    Calibri
3983    2176    Calibri Light
3987    3752    Segoe UI Symbol
4517    902 Gabriola
5928    5636    DejaVu Sans Condensed
5928    5636    DejaVu Sans
6991    3240    Cambria
6991    4362    Cambria Math
12747   12639   Malgun Gothic
19321   16059   MS PMincho
19321   16059   MS Mincho
22134   22202   DFKai-SB
22213   16059   MS UI Gothic
22213   16059   MS PGothic
22213   16059   MS Gothic
23942   16946   Meiryo UI
23942   16946   Meiryo
28562   28542   SimHei
28562   28542   KaiTi
28562   28542   FangSong
28762   28735   SimSun
28762   28735   NSimSun
29220   28977   Microsoft JhengHei
29354   29095   Microsoft YaHei
34046   28991   PMingLiU
34046   28991   MingLiU
34046   33877   MingLiU_HKSCS
39680   20626   GungsuhChe
39680   20626   Gungsuh
39680   20626   BatangChe
39680   20626   Batang
40194   20626   GulimChe
40194   20626   Gulim
40194   20626   DotumChe
40194   20626   Dotum
42809   42827   SimSun-ExtB
44875   42953   PMingLiU-ExtB
44875   42953   MingLiU-ExtB
44875   42953   MingLiU_HKSCS-ExtB
50377   38933   Arial Unicode MS
  1. 如果其中有一个 Font 的 2 个值相同,我还没有注意到。
  2. 虽然大多数计数都很接近(在 canDisplay 方法返回值的 10% 以内),但有些计数却截然不同。

最佳答案

<face-palm />就在文档的顶部。对于 Font ..

Characters and Glyphs

A character is a symbol that represents an item such as a letter, a digit, or punctuation in an abstract way. For example, 'g', LATIN SMALL LETTER G, is a character.

A glyph is a shape used to render a character or a sequence of characters. In simple writing systems, such as Latin, typically one glyph represents one character. In general, however, characters and glyphs do not have one-to-one correspondence. For example, the character 'á' LATIN SMALL LETTER A WITH ACUTE, can be represented by two glyphs: one for 'a' and one for '´'. On the other hand, the two-character string "fi" can be represented by a single glyph, an "fi" ligature. In complex writing systems, such as Arabic or the South and South-East Asian writing systems, the relationship between characters and glyphs can be more complicated and involve context-dependent selection of glyphs as well as glyph reordering. A font encapsulates the collection of glyphs needed to render a selected set of characters as well as the tables needed to map sequences of characters to corresponding sequences of glyphs.

嗯,你每天都会学到新东西。那是我的“当天的学习项目”。

关于java - Font.getNumGlyphs() 返回的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19467137/

相关文章:

java - 是否有不允许空值的基本 Java Set 实现?

java - 全息圆形进度条速度

java - 无法从 src/main/java 调用 src/test/java 内的代码?

java - Json将String中的&转换为\u0026

css - 在浏览器中使用 OpenType 字体

java - 调用输入到字符串中的数据

iphone - iPhone上的日语字符编码问题

Python 请求带有 Unicode 参数的 URL

css font twitter like close button,我错过了什么?

css - 谷歌字体的字体短语法