// 유니코드 코드포인트 얻기 (mb_ord 대체)
function uniOrd($ch) {
$u = mb_convert_encoding($ch, 'UCS-4BE', 'UTF-8');
$val = unpack('N', $u);
return $val[1];
}
// mb_chr 호환
function mb_chr_compat($code) {
if (function_exists('mb_chr')) return mb_chr($code, 'UTF-8');
return mb_convert_encoding(pack('N', $code), 'UTF-8', 'UCS-4BE');
}
// 한글 분해(완성형 글자 -> 초중종 인덱스), 한글이 아니면 null 반환
function decomposeHangul($char) {
$code = uniOrd($char);
if ($code < 0xAC00 || $code > 0xD7A3) return null;
$sIndex = $code - 0xAC00;
$cho = intdiv($sIndex, 21*28);
$jung = intdiv($sIndex % (21*28), 28);
$jong = $sIndex % 28;
return ['cho'=>$cho, 'jung'=>$jung, 'jong'=>$jong];
}
// 조합(인덱스 -> 완성형 글자)
function composeHangul($cho, $jung, $jong) {
$code = 0xAC00 + $cho * 21 * 28 + $jung * 28 + $jong;
return mb_chr_compat($code);
}
function makeAutocompleteSteps($word) {
// 초/중/종 문자 표 (표시용)
$chosung = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"];
$jungsung = ["ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅘ","ㅙ","ㅚ","ㅛ","ㅜ","ㅝ","ㅞ","ㅟ","ㅠ","ㅡ","ㅢ","ㅣ"];
$jongsung = ["","ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ","ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ",
"ㅁ","ㅂ","ㅄ","ㅅ","ㅆ","ㅇ","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"];
$steps = [];
$prefix = ""; // 이미 완성된 이전 음절들 누적
$len = mb_strlen($word, 'UTF-8');
for ($i = 0; $i < $len; $i++) {
$ch = mb_substr($word, $i, 1, 'UTF-8');
$d = decomposeHangul($ch);
if ($d === null) {
// 한글 완성형이 아니면 그냥 붙여서 한 단계로 추가
$prefix .= $ch;
$steps[] = $prefix;
continue;
}
$cho = $d['cho'];
$jung = $d['jung'];
$jong = $d['jong'];
// 1) 초성 입력 (접두사 + 초성자모)
$steps[] = $prefix . $chosung[$cho];
// 2) 중성 입력 -> 초성+중성(종성 없음)으로 보여줌
$syll_no_jong = composeHangul($cho, $jung, 0);
$steps[] = $prefix . $syll_no_jong;
// 3) 종성 있으면 종성 입력 -> 초성+중성+종성
if ($jong > 0) {
$syll_with_jong = composeHangul($cho, $jung, $jong);
$steps[] = $prefix . $syll_with_jong;
$prefix .= $syll_with_jong; // 완성된 음절을 누적
} else {
$prefix .= $syll_no_jong;
}
}
// 중복 제거(순서 보존)
$uniq = [];
$seen = [];
foreach ($steps as $s) {
if (!isset($seen[$s])) { $seen[$s] = true; $uniq[] = $s; }
}
return $uniq;
}
// 테스트
print_r(makeAutocompleteSteps("닭다리"));