Sinhala is an abugida: each consonant letter carries an inherent vowel, a. The letter ක on its own is read ka. To write any other vowel after a consonant, Sinhala adds a dependent vowel sign, a pilla (plural pili), to the consonant. To write the consonant with no vowel at all, it adds the al-lakuna (also called hal kirīma), ්.
Pili are not separate letters. They attach to the left, the right, above or below the consonant, sometimes on two sides at once, and some of them change shape depending on the consonant they meet. That is what makes Sinhala interesting to read, and demanding to set in type.
The vowel signs
| Sign | With ක | Name | Sound | Code point |
|---|---|---|---|---|
| ා | කා | ælapilla | ā | U+0DCF |
| ැ | කැ | ketti ædapilla | æ | U+0DD0 |
| ෑ | කෑ | diga ædapilla | ǣ | U+0DD1 |
| ි | කි | ketti ispilla | i | U+0DD2 |
| ී | කී | diga ispilla | ī | U+0DD3 |
| ු | කු | ketti pāpilla | u | U+0DD4 |
| ූ | කූ | diga pāpilla | ū | U+0DD6 |
| ෘ | කෘ | gætapilla | ru (ṛ) | U+0DD8 |
| ෙ | කෙ | kombuva | e | U+0DD9 |
| ේ | කේ | diga kombuva | ē | U+0DDA |
| ෛ | කෛ | kombu deka | ai | U+0DDB |
| ො | කො | kombuva and ælapilla | o | U+0DDC |
| ෝ | කෝ | kombuva, ælapilla and al-lakuna | ō | U+0DDD |
| ෞ | කෞ | kombuva and gayanukitta | au | U+0DDE |
| ් | ක් | al-lakuna | no vowel | U+0DCA |
Ketti means short and diga means long. The long ṝ sign (ෲ, U+0DF2) and the gayanukitta forms (ෟ, ෳ) are mostly used for Sanskrit and Pali.
Logical order: type what you hear, not what you see
The kombuva (ෙ) is drawn before the consonant, but it is pronounced after it. Unicode always stores text in logical order, the order it is spoken, so කෙ is stored as ක followed by ෙ:
කෙ = U+0D9A SINHALA LETTER ALPAPRAANA KAYANNA
+ U+0DD9 SINHALA VOWEL SIGN KOMBUVA
The shaping engine (HarfBuzz, DirectWrite or CoreText) moves the kombuva in front of the consonant when it draws the text. Keyboards and input methods follow the same rule: you type the consonant first, then the vowel sign.
Legacy Sinhala fonts from the 256-slot era, the ASCII-mapped fonts many Sri Lankan publishers still use, stored text in visual order instead: kombuva first, then the consonant. The page looked right, but the stored text was out of order, so it could not be searched, sorted or read aloud. Converting that text to Unicode means reordering it as well as remapping the characters.
Signs that are really two signs
Four of the vowel signs above are built from parts that already exist on their own:
| Sign | Is equivalent to |
|---|---|
| ේ U+0DDA | ෙ U+0DD9 + ් U+0DCA |
| ො U+0DDC | ෙ U+0DD9 + ා U+0DCF |
| ෝ U+0DDD | ෙ U+0DD9 + ා U+0DCF + ් U+0DCA |
| ෞ U+0DDE | ෙ U+0DD9 + ෟ U+0DDF |
Unicode treats each pair as canonically equivalent: both spellings mean the same text. Normalising to NFC turns the sequences into the single code points. Two practical rules follow:
- Input methods should emit the single code points (ො, not ෙ + ා).
- Search, sorting and comparison should normalise first. Otherwise කො typed one way won't match කො typed the other way.
A well-made font draws both spellings identically, so the reader never sees the difference.
Signs that change shape
Most pili are drawn the same way on every consonant. The pāpilla (ු, ූ) and the gætapilla (ෘ) are the exceptions. Where they join the consonant depends on how the consonant's stroke ends, so a font needs several versions of each sign, and a few combinations are drawn as unique ligatures. The best known are රු and රූ, where the vowel sign sits to the right of ර instead of below it, and the ku family (කු, ගු, තු, භු), whose stroke ends in a curl rather than a separate mark.
For a type designer, this means a Sinhala font is more than a set of letters and marks. OpenType substitution features such as blws and psts (with akhn, rphf, vatu and pstf for the joined consonant forms below) choose the right form for each combination. Mooniak's Lanka Glyphsets standard lists the forms a font needs at each level, with a name for every glyph.
Al-lakuna and joiners
The al-lakuna removes the inherent vowel: ක් is just k. When a consonant with al-lakuna is followed by another consonant, the two can stay apart, as in ත්ම (in ආත්මය), or join into one shape. Sinhala marks the joined forms with the invisible ZERO WIDTH JOINER (ZWJ, U+200D):
| Form | Sequence | Example |
|---|---|---|
| yansaya | consonant + ් + ZWJ + ය | ක්ය |
| rakāransaya | consonant + ් + ZWJ + ර | ක්ර |
| rēpaya | ර + ් + ZWJ + consonant | ර්ක |
| touching letters | consonant + ZWJ + ් + consonant | ක්ව |
These sequences come from the Sri Lankan encoding standard, SLS 1134. If the ZWJ is missing, a correct font shows the al-lakuna as written: ක්ය rather than ක්ය. That is right, because the spelling is different. Copying text through software that strips "invisible" characters is a common cause of broken yansaya and rakāransaya on the web.
Further reading
- The Unicode Standard, chapter 13, "South and Central Asia II": Sinhala
- SLS 1134: Sinhala character code for information interchange, Sri Lanka Standards Institution
- Sinhala Font Design: Mooniak's design research and test tools for Sinhala type