Draft. Version 0.1. The specification defines the character repertoire, its code points and how a font composes the glyphs. The code points are provisional and lie in the Supplementary Private Use Area-A. There is no reference font yet, so the tables of the specification show no glyphs.
Syllable grammar
A syllable is written with the four kinds of component of a Vietnamese syllable: onset (A), nucleus (N), coda (C) and tone (T). The nucleus includes the glide: oa, uy and similar are nuclei of their own. Two control characters of PA build the cells, as in QATT: the joiner J (U+F00D0, PA JOINER) puts two parts side by side into one cell, the combiner K (U+F00D1, PA COMBINER) stacks two cells into one.
Stem = A J N
Syllable = Stem [ T ] one cell: the stem with a small tone mark
| Stem C [ T ] two cells: the stem, then the coda with its tone
| Stem K Ext one cell: the stem above the extension
Ext = C [ T ] | T
Alone = A | N | C [ T ] | T a cell of its own, full size
- A stem always has an onset. A syllable without an onset uses the onset
ZERO(writtenzin code), which has a shape of its own:z J N. - Without J the onset and the nucleus are two cells (each in its full size); a stem needs J.
- A coda without a tone is valid (tai, ngang tone, which can also be written with the tone mark ngang). A tone alone is valid (an open syllable with a tone).
- A tone belongs to the character before it if that is a stem or a coda, and after K it is part of the stack. Anywhere else (alone, behind an onset or a nucleus that stands alone) it is a cell of its own, in full size.
- J is only valid between an onset and a nucleus, K only between a stem and an extension.
K chooses the layout, and it is optional:
- Without K a syllable has at most two cells side by side: the stem cell (with a small tone mark, if the tone follows the stem directly) and the coda cell (C and T in one glyph, or C alone).
- With K between stem and extension both form one cell: the stem above, the extension below, in one em square like a CJK character. This is the form for vertical text and for mixing with Chữ Nôm.
Character repertoire
23 onsets, 22 nuclei, 10 codas and 6 tones are encoded, 61 characters, and the joiner and the combiner, 63 in all. The combined glyphs are not encoded: the font builds them from sequences (see Composition).
| Class | Count | Combined with |
|---|---|---|
| A onset | 23 | J N: 23 × 22 = 506 stem glyphs |
| N nucleus | 22 | — |
| C coda | 10 | T: 10 × 6 = 60 coda glyphs |
| T tone | 6 | — |
| J joiner | — | onset and nucleus into a stem |
| K combiner | — | stem and extension into one stacked cell |
Code points
The classes lie in separate ranges, so the class of a character is known from its code point and a sequence is validated with a regular expression. The block starts at U+F00D0 with the two control characters. Before it, U+F00B0..U+F00CF is the block of the controls that PA and QATT share: annotation over U+F00B0, annotation under U+F00B1 (a CJK character, the control and a syllable: the syllable is written small over or under the character), U+F00B2 end of the annotation (reserved); U+F00B3..U+F00CF are free.
| Class | Range | Used | Code point |
|---|---|---|---|
| J joiner | U+F00D0 | 1 | PA JOINER |
| K combiner | U+F00D1 | 1 | PA COMBINER |
| A onset | U+F00D2..U+F00E8 | 23 | F00D2 + i |
| N nucleus | U+F00E9..U+F00FE | 22 | F00E9 + i |
| C coda | U+F00FF..U+F0108 | 10 | F00FF + i |
| T tone | U+F0109..U+F010E | 6 | F0109 + (tone − 1) |
[U+F00D2-F00E8] ( U+F00D0 [U+F00E9-F00FE] ( [U+F0109-F010E] | U+F00D1? [U+F00FF-F0108] [U+F0109-F010E]? | U+F00D1 [U+F0109-F010E] )? )? | [U+F00E9-F00FE] | [U+F00FF-F0108] [U+F0109-F010E]? | [U+F0109-F010E]
The order inside each class is that of the earlier PA font, see The earlier font.
A: onsets
| i | Code point | Character name | Legacy name | Quốc Ngữ |
|---|---|---|---|---|
| 0 | U+F00D2 | PA ONSET ZERO | _ | none (placeholder shape) |
| 1 | U+F00D3 | PA ONSET B | b | b |
| 2 | U+F00D4 | PA ONSET C | c | c, k, q |
| 3 | U+F00D5 | PA ONSET CH | ch | ch |
| 4 | U+F00D6 | PA ONSET DD | d | đ |
| 5 | U+F00D7 | PA ONSET D | dz | d |
| 6 | U+F00D8 | PA ONSET PH | ph | ph |
| 7 | U+F00D9 | PA ONSET G | g | g, gh |
| 8 | U+F00DA | PA ONSET GI | gi | gi |
| 9 | U+F00DB | PA ONSET H | h | h |
| 10 | U+F00DC | PA ONSET KH | kh | kh |
| 11 | U+F00DD | PA ONSET L | l | l |
| 12 | U+F00DE | PA ONSET M | m | m |
| 13 | U+F00DF | PA ONSET N | n | n |
| 14 | U+F00E0 | PA ONSET NG | ng | ng, ngh |
| 15 | U+F00E1 | PA ONSET NH | nh | nh |
| 16 | U+F00E2 | PA ONSET R | r | r |
| 17 | U+F00E3 | PA ONSET S | s | s |
| 18 | U+F00E4 | PA ONSET T | t | t |
| 19 | U+F00E5 | PA ONSET TH | th | th |
| 20 | U+F00E6 | PA ONSET TR | tr | tr |
| 21 | U+F00E7 | PA ONSET V | v | v |
| 22 | U+F00E8 | PA ONSET X | x | x |
The character names are Unicode style (PA ONSET …, PA VOWEL …, PA CODA …, PA TONE …) and spelled in Telex, after the main spelling of the sound: DD = đ, D = d, AW = ă, AA = â, OW = ơ, UW = ư, EE = ê, OO = ô. The drawings of these characters are the full-size master forms; every other form (smaller onsets, stacked forms) is derived from them. In code (glyph names, input methods) the zero onset is written z. The legacy name is that of the earlier font.
dz is the sound written d, d the sound written đ. The shape of an onset depends on the nucleus it stands with (large, small, extra small); that is part of the stem glyph, not of the encoding.
N: nuclei
| i | Code point | Character name | Legacy name | Shape | Quốc Ngữ |
|---|---|---|---|---|---|
| 0 | U+F00E9 | PA VOWEL A | a | a | a |
| 1 | U+F00EA | PA VOWEL OW | ar | a2 | ơ |
| 2 | U+F00EB | PA VOWEL AW | ae | aw | ă |
| 3 | U+F00EC | PA VOWEL AA | aer | aw2 | â |
| 4 | U+F00ED | PA VOWEL EE | e | e | ê |
| 5 | U+F00EE | PA VOWEL E | er | e2 | e |
| 6 | U+F00EF | PA VOWEL I | i | i | i |
| 7 | U+F00F0 | PA VOWEL IEE | ir | i2 | iê, ia, yê, ya |
| 8 | U+F00F1 | PA VOWEL OO | o | o | ô |
| 9 | U+F00F2 | PA VOWEL O | or | o2 | o |
| 10 | U+F00F3 | PA VOWEL U | u | u | u |
| 11 | U+F00F4 | PA VOWEL UOO | ur | u2 | uô, ua |
| 12 | U+F00F5 | PA VOWEL UW | y | y | ư |
| 13 | U+F00F6 | PA VOWEL UWOW | yr | y2 | ươ, ưa |
| 14 | U+F00F7 | PA VOWEL OA | wa | wa | oa |
| 15 | U+F00F8 | PA VOWEL UOW | war | wa2 | uơ |
| 16 | U+F00F9 | PA VOWEL OAW | wae | waw | oă |
| 17 | U+F00FA | PA VOWEL UAA | waer | waw2 | uâ |
| 18 | U+F00FB | PA VOWEL UEE | we | we | uê |
| 19 | U+F00FC | PA VOWEL OE | wer | we2 | oe |
| 20 | U+F00FD | PA VOWEL UY | wi | wi | uy |
| 21 | U+F00FE | PA VOWEL UYEE | wir | wi2 | uyê, uya |
The names are those of the earlier font. Shape is the name of the base stroke in the drawing; a nucleus starting with w is a glide nucleus (the stroke of the glide plus the stroke of the vowel).
C: codas
| i | Code point | Character name | Legacy name | Quốc Ngữ |
|---|---|---|---|---|
| 0 | U+F00FF | PA CODA U | U | u, o |
| 1 | U+F0100 | PA CODA I | I | i, y |
| 2 | U+F0101 | PA CODA M | M | m |
| 3 | U+F0102 | PA CODA N | N | n |
| 4 | U+F0103 | PA CODA NG | NG | ng |
| 5 | U+F0104 | PA CODA NH | NH | nh |
| 6 | U+F0105 | PA CODA P | P | p |
| 7 | U+F0106 | PA CODA T | T | t |
| 8 | U+F0107 | PA CODA C | C | c |
| 9 | U+F0108 | PA CODA CH | CH | ch |
T: tones
| Tone | Code point | Character name | Vietnamese |
|---|---|---|---|
| 1 | U+F0109 | PA TONE SAC | sắc |
| 2 | U+F010A | PA TONE HUYEN | huyền |
| 3 | U+F010B | PA TONE HOI | hỏi |
| 4 | U+F010C | PA TONE NGA | ngã |
| 5 | U+F010D | PA TONE NANG | nặng |
| 6 | U+F010E | PA TONE NGANG | ngang (level tone, an explicit mark) |
Composition
A font renders the sequences with glyph substitution (OpenType ccmp). The classes tell what belongs together within a cell; the joiner and the combiner build the cells.
| Sequence | Result |
|---|---|
| A, N, C, T | one cell each in the full size: the master drawings (23 + 22 + 10 + 6) |
| A J N | stem glyph, onset and nucleus reduced to fit one cell (506) |
| A J N T | the stem with a small tone mark inside the cell (the tone becomes a mark without width, 6) |
| C T | coda glyph with its tone (60) |
| A J N C [T] | two cells: the stem, then the coda |
| A J N K E (E = C T, C or T) | one cell: the stem in its stacked form above, the extension in its stacked form below (see below) |
| N without an onset | the nucleus alone in its full size; for a syllable without an onset an input method writes z J N |
Every cell is one em wide.
The stacked cell
With the combiner stem and extension share one em square, like a CJK character; without it they are two cells. Both forms come from the drawings of PA 1 Normal. The stacked forms are drawn for the stack, they are not squeezed copies of the separate forms, and the font has them as glyphs of their own.
Top to bottom the stacked cell holds the stem, then the tone mark, then the coda. The stem is drawn in one of three heights, which depends on what follows the combiner:
After A J N K | Stem form | Height of the stem |
|---|---|---|
| C T (coda and tone) | Z | smallest, about a quarter of the cell |
| C alone, or T alone (not tone 2) | ZZ | about a third to a half of the cell |
| T2 alone (huyền) | ZZZ | largest, more than half: tone 2 is a single bar at the bottom |
So the stacked cell is not a precomposed glyph for every pair (506 × 76 = 38,456 glyphs). The font substitutes the three parts separately, as the stack of QATT does it:
- the stem becomes its upper form Z, ZZ or ZZZ (3 × 506 glyphs), chosen by a contextual rule that looks at the characters after the combiner;
- the combiner becomes a glyph without width;
- the extension becomes its lower form with no advance, drawn over the cell of the stem (76 glyphs: 60 coda and tone, 10 codas, 6 tones). The coda of a coda and tone pair has three drawings by tone (for tones 1 and 2, for 3, 4 and 6, for 5), as in the separate form.
Where the drawings of the ZZZ form are missing (the onsets ph, ng, t, th, tr and the glide bars), the font uses the ZZ form.
Only the large forms of onsets, nuclei and glides are master drawings. The smaller onsets (small, extra small) and the stacked heights Z, ZZ and ZZZ are derived from them by one fixed scaling for each size and each family, applied to the strokes before they are drawn, so that the stroke keeps its width. A stem is made of its parts (onset, glide, nucleus) and has no outline of its own. Codas, tones and the lower forms of the stack are drawings of PA 1 Normal; for a form it lacks the font takes the nearest drawing, and for tone 6 in the stack the unstacked tone flattened.
PA and QATT
PA is a constructed script made for this website. Its font is a file of its own, not part of the QATT fonts and not part of the big Chữ Nôm fonts:
- Own font. The family is loaded only by pages that show PA. The glyph rules (stems, stacked cells) are those of this font alone and need no coordination with the QATT rules.
- Code points. QATT uses
U+F0000..U+F00AF, PAU+F00D0..U+F010E; between themU+F00B0..U+F00CFholds the annotation controls that both share. Nothing overlaps, so the two fonts could be merged later without any change to a text. - Control characters. PA has its own joiner and combiner (
U+F00D0,U+F00D1) and does not use the controls of QATT (U+F009A,U+F009B), so the two scripts never combine, even in one line. They mean the same in both: side by side in one cell, stacked in one cell. The QATT tone marks (U+F009C..U+F00A3) have no meaning in PA text, and a PA tone is not a QATT tone mark. - Mixed text. A page with both scripts names both families; each font draws its own code points.
- Size. The PA font has about 2,227 glyphs: 61 master cells, 506 stems, 60 coda glyphs, 6 small tone marks, 1,518 upper forms and 76 lower forms of the stacked cell. Its cell is square like that of QATT, so mixed text keeps one line height. The two control characters are two more glyphs without width.
Reading Quốc Ngữ
A syllable of Quốc Ngữ is split into onset, nucleus, coda and tone, then mapped to the names above.
- Tone. The accent of the vowel gives the tone and is removed: sắc 1, huyền 2, hỏi 3, ngã 4, nặng 5. No accent: no tone.
- Onset. k and q are
C; gh isG; ngh isNG; d isD; đ isDD; g before i isGI(the names of the characters,PA ONSET …). No onset isZERO. - Glide. qu is the onset
Cplus a glide nucleus (quô is read as uâ). The glide forms oa, oă, uơ, uâ, uê, oe, uy, uyê are the nucleiOA,OAW,UOW,UAA,UEE,OE,UY,UYEE. - Coda. o after the nucleus is the coda
U, y isI. - Short a. a before the codas u, y, nh, ch is written with the nucleus
AW(ă).
The earlier font
The earlier PA font pa.ttf of the old site has the same repertoire in the Basic Multilingual Plane private use area (U+E001..U+E272, with the tone 6 missing). Its code points convert to this block:
| Earlier code point | New |
|---|---|
stem E062 + a + 23·(1 + b) | A = a, N = b |
onset alone E062 + a | A = a |
coda and tone E026 + 10·t + c | C = c, T = t (t = 0: no tone) |
tone alone E001..E005 | T = 1..5 |
Open points
- Tone marks. PA has its own six tone characters, as it has its own joiner and combiner. Proposal: keep them separate from QATT.
- Unfinished drawings. Tone 6 (ngang) is not complete in the source: its stacked forms with a coda (
z-_t6) are missing, the stacked tone alone is a copy of the unstacked one, and the unstacked large tone 6 is a copy of tone 5. Its list of onsets also marksxas “todo”. - Combinations that Vietnamese does not use (for instance
bwith a glide nucleus). Proposal: the font draws all 506 stems, the input method decides what is offered.