Font Development Best Practices

Technical guidance regarding font development and production

View project onGitHub

3.6 Unicode Ranges

There are two means within an OpenType font to indicate which scripts and Unicode ranges a font supports: the OpenType ulUnicodeRange bits in the ‘OS/2’ table and the newer ‘meta’ table.


The OpenType OS/2 table specification lists the ranges defined by ulUnicodeRange and which bits must be set to indicate support for that range. Most font editors provide a user interface that lists the ranges and allows you turn ranges on and off, so hacking bit fields is rarely necessary.

According to Peter Constable’s presentation at TYPO Labs 2018 the ulUnicodeRange field is rarely used anymore by OSes to determine font script coverage. One major reason is that the field has run out of space, and no new ranges can be added. However there are older systems that still look at this info, so the ulUnicodeRange bits should be set if the font is intended to support any of the ranges defined in the spec.

One special case: If the font includes any supplemental plane characters, then the Non-Plane 0 bit (57) should be set. This is true whether or not the character is in a range that has a ulUnicodeRange bit defined. So in the case of Phoenician, which is in a supplemental plane (10900-1091F) and has a defined bit (58), both that bit and the Non-Plane 0 bit (57) should be set.

‘meta’ table

Because of the above-mentioned limitations of the existing ulUnicodeRange field, the meta table was added to the OpenType specification (starting with version 1.8 in 2016). OpenType fonts should include the ‘meta’ table describing the languages and scripts for which the font was designed as well as the languages and scripts that the font is capable of supporting.