I'm gathering here some informations about khmer fonts design. This is a work in progress but feel free to tell me how to improve it!

1. Design the glyphs

Full letters

uni179A uni179C uni17A2 
uni1780 uni1797 uni1782 uni178F uni17A5 uni17A6 
uni1785 uni1794 uni1798 uni17AB uni17AC uni17A0 uni1783 uni1799 
uni179B uni179F uni178E uni1788 
uni1784 uni1787 uni178A uni1795 uni178B uni1790 uni17AF 
uni1786 uni1792 uni1796 uni17B0 uni1789 uni1789.beforesub uni1789 uni1789.beforesub uni17AD uni17AE uni178D uni178C 
uni1781 uni17A7 uni17AA uni17B1 uni17B3 uni1793 uni1791 uni17A1 
uni17A8 uni17A9 
uni179D uni179E 

The last 4 characters are used only for pali.


Type 1

uni17D21780 uni17D21781 uni17D21782 uni17D21784 
uni17D21785 uni17D21786 uni17D21787 uni17D21789 uni17D21789.undernyo 
uni17D2178A uni17D2178B uni17D2178C uni17D2178E 
uni17D2178F uni17D21791 uni17D21792 uni17D21793 
uni17D21795 uni17D21796 uni17D21797 uni17D21798 
uni17D2179B uni17D2179C 
uni17D217A0 uni17D217A1 uni17D217A2 
uni17D217A5 uni17D217A7 uni17D217AB uni17D217AF 

If you want the same shape for lower subscripts, you don't need to design them separately. Glyph positioning (GPOS for OpenType and vertical kerning for AAT) are meant for that kind of situations.

Type 2 & 3

uni17D21783 uni17D21788 uni17D2178D 
uni17D21794 uni17D21799 uni17D2179F 

These need a version with a longer descender.

uni17D21783.lower uni17D21788.lower uni17D2178D.lower 
uni17D21794.lower uni17D21799.lower uni17D2179F.lower 

Vocalic signs

uni17B7 uni17B8 uni17B9 uni17BA 
uni17BB uni17BC uni17BD 
uni17BF uni17C0 uni17C4 uni17C5 
uni17C1 uni17C2 uni17C3 

As for type 1 subscript consonants, superscript and subscript vowels might need a higher/lower version but this could also be achieved with positioning features.

uni17BF and uni17C0 also need a version with longer descender.

uni17BF.lower uni17C0.lower 

Diacritic signs

uni17C6 uni17C7 uni17C8 
uni17C9 uni17CA 
uni17CB uni17CC uni17CD uni17CE uni17CF uni17D0 uni17D1 


uni17D4 uni17D5 uni17D6 uni17D7 
uni17D9 uni17DA 


uni17E1 uni17E2 uni17E3 uni17E4 uni17E5 
uni17E6 uni17E7 uni17E8 uni17E9 uni17E0 

Cursive numbers

uni17F1 uni17F2 uni17F3 uni17F4 uni17F5 
uni17F6 uni17F7 uni17F8 uni17F9 uni17F0 

Lunar date symbols

uni19E1 uni19E2 uni19E3 uni19E4 uni19E5 uni19E6 uni19E7 uni19E8 uni19E9 uni19EA uni19EB uni19EC uni19ED uni19EE uni19EF 
uni19F1 uni19F2 uni19F3 uni19F4 uni19F5 uni19F6 uni19F7 uni19F8 uni19F9 uni19FA uni19FB uni19FC uni19FD uni19FE uni19FF 

1b. Design the ligatures

Different strategies are possible regarding the ligatures:

In the last case, the ka glyph gets substituted by the ligature but keeps the advance of the ka alone, aa being then substituted by a space. This makes shaping with subscripts as simple as with individual glyphs while keeping the beauty of single glyphs.


uni179417B6 uni179417C5 

strongly recommended

uni178017B6 uni179717B6 uni178217B6 uni178F17B6 
uni178617B6 uni179217B6 uni179D17B6 
uni179A17B6 uni17A217B6 uni179E17B6 
uni179817B6 uni178317B6 uni179917B6 
uni179B17B6 uni179F17B6 uni178817B6 uni178D17B6 uni17A117B6 
uni178317B6 uni178817B6 uni178D17B6 
uni179417B6 uni179917B6 uni179F17B6 
uni17D2178317B6 uni17D2178817B6 uni17D2178D17B6 
uni17D2179417B6 uni17D2179917B6 uni17D2179F17B6 
uni178017C5 uni179717C5 uni178217C5 uni178F17C5 
uni178617C5 uni179217C5 uni179D17C5 
uni179A17C5 uni17A217C5 uni179E17C5 
uni179817C5 uni178317C5 uni179917C5 
uni179B17C5 uni179F17C5 uni178817C5 uni178D17C5 uni17A117C5 
uni178317C5 uni178817C5 uni178D17C5 
uni179417C5 uni179917C5 uni179F17C5 
uni17D2178317C5 uni17D2178817C5 uni17D2178D17C5 
uni17D2179417C5 uni17D2179917C5 uni17D2179F17C5 

recommended for khom script

uni178717B6 uni178717C5 uni179C17B6 uni179C17C5 
uni178017B7 uni178017B8 uni178017B9 uni178017BA 
uni178217B7 uni178217B8 uni178217B9 uni178217BA 
uni178F17B7 uni178F17B8 uni178F17B9 uni178F17BA 
uni179717B7 uni179717B8 uni179717B9 uni179717BA 
uni179D17B7 uni179D17B8 uni179D17B9 uni179D17BA 
uni179C17B7 uni179C17B8 uni179C17B9 uni179C17BA 
uni179F17B7 uni179F17B8 uni179F17B9 uni179F17BA 

2. Shaping instructions

A khmer-aware OpenType engine (Uniscribe, Harfbuzz, ICU, etc.) takes care of the reordering of the RO, E, AE, AI and the first part of the split vowels (OE, YA, IE, OO, AU). For AAT and Graphite engines, you need to program it into the font.

The rest (subscripts, ligatures, ...) has to be programmed for both types of engines.


COENG (U+17D2) followed by a consonant or some independent vowels should be changed into the corresponding subscript. COENG RO followed by subscripts (after the base letter) as well as Type 3 subscripts preceeded by other subscripts need to be changed into an alternate with longer descender. Type 1 subscripts preceeded by another subscript need to be lowered, or change into a lower alternate (if exists). The same applies to vocalic signs U, UU and UA.


When letter NYO ញ is followed by a subscript, its glyph needs to be changed into the "subscript-less" alternate. If the following subscript is COENG NYO, it also needs to be changed into its alternate form.

Ligatures with AA/OO and AU

This includes the consonants directly followed by AA/OO/AU but also the ones with one or several subscripts and/or vowels, in which cases these need to be shifted to the left, unless using alternate forms instead of ligatures.