hangul.dev

The Geometry of Hangul

Korean writing is an engineered system -- each character a precise assembly of geometric components designed by King Sejong in 1443.

Unlike scripts that evolved organically over millennia, Hangul was consciously designed. Each consonant shape maps to the position of the tongue, lips, and throat during pronunciation. The vowels are built from three elements: a dot (representing the heavens), a horizontal line (the earth), and a vertical line (humanity). This philosophical underpinning makes Hangul not just a writing system but a cosmological diagram.

The five basic consonant shapes -- , , , , -- represent the shape of the speech organs during articulation. mimics the tongue touching the soft palate. shows the tongue touching the alveolar ridge. Each added stroke represents aspiration or tensing.

// Basic consonant mapping (g/k) tongue root (n) tongue tip (m) lips (s) teeth (ng) throat

Vowel Philosophy

Three cosmic principles become ten vowels -- heaven, earth, and humanity combine in precise geometric arrangements.

The vowel system begins with three fundamental shapes: · (a round dot, heaven), (a horizontal line, earth), and (a vertical line, humanity). From these three elements, all Korean vowels are constructed through combination and position.

Hangul characters are assembled into syllable blocks -- each block occupying a uniform square space regardless of the number of components. A block contains an initial consonant, a medial vowel, and an optional final consonant. This block system creates the distinctive visual rhythm of Korean text.

// Syllable block structure [initial] + [medial] (ha) [initial] + [medial] + [final] (han) [initial] + [medial] + [final] (geul)

Korean pronunciation follows systematic rules. Sound changes occur at syllable boundaries: nasalization, palatalization, and aspiration transform how characters are spoken in context. Understanding these rules is the bridge between reading and speaking.

For Developers

Working with Hangul in code requires understanding Unicode ranges, normalization forms, and syllable decomposition algorithms.

Hangul occupies several Unicode blocks. The Hangul Syllables block (U+AC00 to U+D7A3) contains 11,172 precomposed syllable characters. The Hangul Jamo block (U+1100 to U+11FF) contains the individual consonants and vowels. The Hangul Compatibility Jamo block (U+3130 to U+318F) provides standalone jamo for display.

// Hangul syllable decomposition function decompose(syllable) { const code = syllable.charCodeAt(0) - 0xAC00; const initial = Math.floor(code / 588); const medial = Math.floor((code % 588) / 28); const final_ = code % 28; return { initial, medial, final_ }; }

Korean text can exist in two Unicode normalization forms: NFC (precomposed, where is a single code point) and NFD (decomposed, where it becomes three separate jamo). This distinction matters for string comparison, search, and database operations. Always normalize before comparing Korean strings.

// NFC vs NFD comparison const nfc = "한".normalize("NFC"); // 1 code point const nfd = "한".normalize("NFD"); // 3 code points nfc === nfd; // false! nfc.length; // 1 nfd.length; // 3

Korean input methods compose characters in real-time as the user types. The standard 2-set (dubeolsik) layout maps consonants to the left hand and vowels to the right. As keys are pressed, the input method engine assembles jamo into syllable blocks, sometimes needing to re-compose when a new vowel arrives after a final consonant.

// Typing sequence for 한글 // ㄴ joins // ㄹ joins