How to Validate Font Naming Tables in FontForge

Verifying that font naming tables comply with industry standards is essential for ensuring your font installs, renders, and functions predictably across different operating systems and applications. This guide explains how to inspect OpenType and TrueType name tables using FontForge's built-in interface, validate structural rules against OpenType specifications, and detect common metadata conflicts using internal validation tools.

1. Access the Naming Tables

FontForge stores standard naming metadata across several tabs within the Font Info dialogue:

  1. Open your font file in FontForge.
  2. Navigate to Element > Font Info (or press Ctrl+Shift+I on Windows/Linux, Cmd+Shift+I on macOS).
  3. In the left-hand sidebar, locate the primary naming categories:
    • PS Names: Contains the PostScript Font Name, Family Name, Name for Humans, and Weight.
    • TTF Names: Contains the OpenType/TrueType name table strings, including Family, Subfamily, Unique ID, Full Name, Version, and Typographic names.

2. Verify Key Standard Name IDs

The OpenType specification requires specific standard Name IDs in the TTF Names tab. Ensure the following IDs are set and follow their standard conventions:

  • Name ID 1 (Font Family Name): Used for font grouping in legacy applications. It must match across styles intended to sit under the same four-style family (Regular, Italic, Bold, Bold Italic).
  • Name ID 2 (Font Subfamily Name): Must strictly be Regular, Italic, Bold, or Bold Italic when paired with standard Name ID 1.
  • Name ID 4 (Full Font Name): Typically the concatenation of Name ID 1 and Name ID 2 (for example, "CustomSans Bold").
  • Name ID 6 (PostScript Name): Must be ASCII-only, contain no spaces, and remain strictly under 63 characters (preferably under 31 characters for legacy PostScript compatibility). Allowed characters are letters, numbers, and hyphens.
  • Name ID 16 (Typographic Family Name) and Name ID 17 (Typographic Subfamily Name): Required if your font family contains more than four styles (e.g., Light, SemiBold, Black). ID 16 holds the overarching family name, while ID 17 holds the specific style name.

3. Check Language and Platform Encodings

OpenType requires that name table entries provide compatibility for both Unicode and Windows platforms:

  1. In Element > Font Info > TTF Names, review the list of string records.
  2. Ensure strings exist under the Unicode (Standard) or Windows platform headings.
  3. Remove redundant, empty, or duplicate entries in localized language fields unless specific translations are intended. FontForge allows you to double-click any field to alter its language tag or platform ID.

4. Run FontForge’s Native Validator

FontForge includes a validation engine that checks table consistency against OpenType and TrueType rules:

  1. Open Element > Validation > Validate....
  2. Ensure that the test suite runs on the entire font.
  3. Review the output window for warnings related to names or OpenType tables. Common flag types include:
    • Non-ASCII characters in PostScript names.
    • Mismatches between the PostScript name in PS Names and Name ID 6 in TTF Names.
    • Invalid style-linking combinations between Name ID 1 and Name ID 2.
    • Missing required records (such as copyright or unique font identifiers).

5. Verify Naming Table Consistency via Python Scripting

For exact compliance testing, you can read the font's raw sfnt naming records using FontForge's integrated Python engine.

Open File > Execute Script... and run:

import fontforge

font = fontforge.activeFont()

# Print all sfnt name records
for record in font.sfnt_names:
    print(f"Language: {record[0]}, NameID: {record[1]} ({record[2]}): {record[3]}")

# Run internal validation
validation_state = font.validate()
if validation_state & 0x40:
    print("Warning: Naming table or PostScript name is invalid.")
else:
    print("Naming table passed standard FontForge validation checks.")

Any discrepancies reported in the console output indicate non-standard encoding, missing IDs, or naming conflicts that must be resolved prior to final font generation.