* @copyright 2011-2026 Nicola Asuni - Tecnick.com LTD * @license https://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE) * @link https://github.com/tecnickcom/tc-lib-unicode * * This file is part of tc-lib-unicode software library. * * Source: section 3.12 "Conjoining Jamo Behavior" of the Unicode standard */ namespace Com\Tecnick\Unicode\Data; /** * Com\Tecnick\Unicode\Data\Hangul * * Algorithmic constants for Hangul Jamo → precomposed Hangul syllable * composition, as defined in section 3.12 of the Unicode Standard. * * Precomposed syllables occupy the range U+AC00–U+D7A3 and are derived by: * * S = SBase + (L − LBase) × NCount + (V − VBase) × TCount + (T − TBase) * * where T = TBase means "no trailing consonant" (TBase itself is not a * trailing consonant; the effective trailing index is 0 in that case). * * @since 2026-04-30 * @category Library * @package Unicode * @author Nicola Asuni * @copyright 2011-2026 Nicola Asuni - Tecnick.com LTD * @license https://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE) * @link https://github.com/tecnickcom/tc-lib-unicode */ final class Hangul { /** * First precomposed Hangul syllable: U+AC00 HANGUL SYLLABLE GA. */ public const SBASE = 0xAC00; /** * First Hangul leading consonant (choseong): U+1100 HANGUL CHOSEONG KIYEOK. */ public const LBASE = 0x1100; /** * First Hangul vowel (jungseong): U+1161 HANGUL JUNGSEONG A. */ public const VBASE = 0x1161; /** * Trailing consonant base value: U+11A7. * * The first actual trailing consonant (jongseong) is U+11A8; TBase is * one below that, so that (T − TBase) gives a 1-based index and a T of * TBase itself encodes "no trailing consonant" (index 0). */ public const TBASE = 0x11A7; /** * Number of leading consonants (19). * * Covers U+1100–U+1112. */ public const LCOUNT = 19; /** * Number of vowels (21). * * Covers U+1161–U+1175. */ public const VCOUNT = 21; /** * Number of trailing consonant slots (28), including the "none" slot. * * Effective trailing consonants: U+11A8–U+11C2 (27 codepoints). * The 28th slot represents absence of a trailing consonant. */ public const TCOUNT = 28; /** * Number of precomposed syllables per leading consonant. * * NCount = VCount × TCount = 21 × 28 = 588. */ public const NCOUNT = self::VCOUNT * self::TCOUNT; /** * Total number of precomposed Hangul syllables. * * SCount = LCount × NCount = 19 × 588 = 11172. */ public const SCOUNT = self::LCOUNT * self::NCOUNT; }