With 1,465 distinct syllables across 44,034 single-word headwords, the National Institute of Korean Language's learner dictionary needs only one outside the 2,350 that South Korea's 1987 character standard encoded: 찟, in 섬찟하다. That standard, KS C 5601-1987 and now KS X 1001, still leaves out 8,822 of the 11,172 syllables Unicode encodes, 쌰 among them. A Hangul syllable is an initial consonant, a vowel and an optional final, and with 19 initials, 21 vowels and 28 finals (27 consonants plus "no final") there are 19 × 21 × 28 = 11,172, from 가 at U+AC00 to 힣 at U+D7A3.
We counted from our processed copy of NIKL's 한국어기초사전 (CC BY-SA 2.0 KR), whose 56,555 entries reduce to 44,034 single-word spellings once homographs are merged. Headwords are a floor: running text adds conjugated forms, names and slang.
An initial, a vowel and a final fold into one code point by arithmetic
Section 3.12 of the Unicode Standard defines the syllables by formula: 0xAC00 + (initial × 21 + vowel) × 28 + final, each letter numbered from zero and final 0 meaning "no final". The standard's own example is 퓛, U+D4DB. Take away 0xAC00 and the remaining 10,459 splits into initial 17 (ㅍ), vowel 16 (ㅟ) and final 15 (ㅀ), which also build its name, HANGUL SYLLABLE PWILH.
The letter order is the dictionary order NIKL sets out in article 4 of the Korean spelling rules, so sorting by code point sorts as a South Korean dictionary does. We ran the formula over all 11,172 syllables, and it matched two implementations of Unicode's decomposition (Node and Python) every time.
A keyboard letter branches into several Unicode characters
ㄱ is at least four characters. Typed alone it is U+3131, a compatibility jamo; starting a syllable it is U+1100, ending one U+11A8, and its halfwidth form, U+FFA1, is listed in Unicode's character database as a narrow variant of U+3131. Unicode's Hangul chapter says the compatibility letters exist for compatibility with KS X 1001 and do not conjoin. That block holds 94 characters: the 51 modern letters a keyboard types (U+3131 to U+3163), a filler and 42 archaic letters such as ㆍ (U+318D). Text that looks identical can hold any of these, and an exact comparison sees different letters.
Decomposed text reassembles into syllables under NFC
NFD splits each syllable into conjoining jamo, and NFC puts them back. All 11,172 syllables survived that round trip. For anyone implementing it by hand, the one-step mapping of a syllable with a final is the open syllable plus the final, so 퓛 maps first to 퓌 (U+D4CC) and U+11B6, and the three-jamo form is the full decomposition. NFC leaves standalone letters alone; of the 94 compatibility jamo, it changed none.
Unicode 18.0.0 was released on 16 September 2026, and its announcement says it introduced no new algorithms. Under Unicode's stability policy, the normalised form of an already-encoded syllable cannot change in a later version.
Archaic letters dissolved into nothing on our decomposer page
Our Hangul jamo decomposer runs that formula, and its syllable arithmetic was exact in seven checks over all 11,172, including a keyboard round trip. The fault lay elsewhere. Until 2 October 2026 the page silently dropped 43 of the 94 compatibility jamo (the filler and the archaic letters), all 52 halfwidth jamo and any lone conjoining jamo, then asked the person who had pasted them to "type or paste some Hangul". Its facts also said the 1987 standard "had room for only 2,350" syllables. We updated the page to label archaic letters and Old Hangul as not modelled (and explain why), map halfwidth forms to their letters, and state the correct size of the 1987 table.
Syllables outside KS X 1001 turn into loose letters in Python's codec
South Korea's standards registry dates KS C 5601, now KS X 1001, to 1974. The 2,350 belong to its 1987 edition, and the standard was last confirmed on 30 October 2024. That edition's ISO registration (IR 149, 1988) describes a 94 × 94 table of 8,836 cells, too small for 11,172 syllables in any case. It gave 2,350 cells to Hangul and 4,888 to hanja, and left 612 unused or user-definable. In an article NIKL publishes, 정인상 of Chungbuk National University says the 2,350 were 「사용 빈도수를 근거하여 가려 뽑은」, selected by frequency of use.
We extracted the 2,350 four ways, from Unicode's KSX1001.TXT mapping, the WHATWG EUC-KR index and two decoders, and got the same set each time. That leaves 8,822 syllables, 79.0% of the total, outside. The missing syllables include not just those with rare finals but 50 of the 399 with no final, 쌰, 햬 and 뽜 among them. Meanwhile 886 of the 2,350 appear in no learner-dictionary headword. The full set did not originate with Unicode, which says its syllables are "taken from KS C 5601-1992, representing the full Johab set".
Python's euc_kr codec writes each missing syllable as eight bytes, a filler followed by three compatibility jamo, a form it attributes to KS X 1001:1998 Annex 3. 똠 becomes a4 d4 a4 a8 a4 c7 a4 b1, which Python reads back correctly. Decoded through the EUC-KR index of the WHATWG Encoding Standard, which browsers follow, the same bytes give an invisible filler and then ㄸㅗㅁ. That index matches Windows code page 949, which writes 똠 as 8c 63, and Python's euc_kr rejects those two bytes as an illegal multibyte sequence. Each side misreads the other's file.
Keystrokes grow into a block one key at a time
A Korean keyboard sends letters, and the input method revises the block with each key. A consonant after a complete syllable joins it as a final until a vowel follows, when it moves on to start the next block. So 닭 then ㅣ gives 달기, because the ㄱ leaves the double final, while 닭 then ㅇ and ㅣ gives 닭이. Type 안녕하세요 with the input set to English and the screen shows dkssudgktpdy, one Latin letter per key on the standard two-set layout. South Korea's keyboard standard, KS X 5002, dates from 1982, though its registry record does not reproduce the layout. We did not test every phone or desktop input method on unusual sequences.
Laughter typed as ㅋㅋㅋ becomes something else under NFKC
NFKC does reach the standalone letters, turning them into conjoining jamo. All 399 pairs of a typed initial and a typed vowel merge into a syllable, so ㄱㅏ becomes 가. Typed laughter, ㅋㅋㅋ, becomes three conjoining initials at U+110F that no longer equal what was typed, and ㅠㅠ becomes U+1172 twice. Only pairs merge, so ㅎㅏㄴㄱㅡㄹ comes out as 하ᄂ그ᄅ. Nine double finals, ㄳ ㄵ ㄶ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ, go to final jamo instead, so ㄱㅏㄳ becomes 갃, while ㅀ and ㅄ map to archaic initials although modern spelling uses them only as finals.
A search index or username check that applies NFKC is comparing text nobody typed. Unicode's Hangul chapter anticipates this: letters meant to stay apart need a non-Korean character between them, and it suggests U+200B ZERO WIDTH SPACE where a line may break there and U+2060 WORD JOINER where it may not.