개발 창고/Android

[Kotlin] How to Extract Initial Consonants

로이제로 2023. 11. 25. 22:00
반응형

 

How to Extract Initial Consonants

 일반적으로 영문이나 숫자 등에서는 초성을 추출하는 게 그리 어렵지 않습니다.

만약 아래와 같이 영문이 있다면

How to extract initial consonants

 첫 번째 글자만 가져오면 초성을 가져오는게 끝,,, 이니 매우 간단합니다.

하지만 한글에서는 조금 다릅니다.

초성을 추출하는 방법

 위에서 첫 글자는 "초"이고 이 중에서 "ㅊ"만을 추출하고 싶으면 어떻게 해야 할까요?

 

1. 첫 번째 글자 가져오기

 첫 번째 글자를 가져오기 위해서는 substirng와 toCharArray를 쓸 수 있습니다.

// 특정 위치의 개수만큼 추출
substring(시작인덱스, 추출개수)

// 글자를 Char 배열로 분할
toCharArray()
// Step. 영문에서 첫 글자 추출
val eng = "How to extract initial consonants"
Log.d("FromActivity", "eng substring >> ${eng.substring(0, 1)}");
Log.d("FromActivity", "eng toCharArray >> ${eng.toCharArray()[0]}");

// Step. 한글에서 첫 글자 추출
val kor = "초성을 추출하는 방법"
Log.d("FromActivity", "kor substring >> ${kor.substring(0, 1)}");
Log.d("FromActivity", "kor toCharArray >> ${kor.toCharArray()[0]}");

첫 글자 추출 결과

 

2. 초성을 가져오는 방법

 초성을 추출하기 위해서는 한글의 유니코드 구성에 대해 이해해야 합니다.

// 한글 유니코드 규칙 = (초성 * 21 + 중성) * 28 + 종성 + 0xAC00
// 초성 = (( 한글 유니코드 규칙 - 0xAC00) / 28) / 21
// 16진수 -> 10진수 : 0xAC00 => 44032
하지만 다 이해하고 가긴 어려우니 함수로 만들어봅니다.
/**
 * @description 초성 추출
 * @param value 추출할 문자열
 */
fun getFirstCh(value:String) : String {
    val chList = arrayOf("ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ")

    val first = value.substring(0, 1)              // 첫 글자 추출
    Log.d("FromActivity", "kor 초성 위치 >> $first")
    val unicode = first.codePointAt(0)                      // 유니코드로 변환
    Log.d("FromActivity", "kor 초성 위치 >> $first >> $unicode")
    val index = (unicode - 44032) / 28 / 21
    Log.d("FromActivity", "kor 초성 위치 >> $first >> $unicode >> $index")
    val result = chList[index]
    Log.d("FromActivity", "kor 초성 위치 >> $first >> $unicode >> $index >> ${result}")

    return result
}

 만약 위의 kor 값에서 초성을 추출한다고 가정하면,

getFirstCh("초성을 추출하는 방법")

초성 추출 결과

 위와 같이 첫 번째 글자를 뽑고, 이 첫 번째 글자의 Unicode의 10진수 값을 가져와서 연산 후 해당 위치 값의 초성을 반환합니다.

 

테스트 전체 소스

package net.royfactory.kotlin

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

class FromActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_from)

        try {
            // Step. 영문에서 첫 글자 추출
            val eng = "How to extract initial consonants"
            Log.d("FromActivity", "eng substring >> ${eng.substring(0, 1)}");
            Log.d("FromActivity", "eng toCharArray >> ${eng.toCharArray()[0]}");
            
            // Step. 한글에서 첫 글자 추출
            val kor = "초성을 추출하는 방법"
            Log.d("FromActivity", "kor substring >> ${kor.substring(0, 1)}");
            Log.d("FromActivity", "kor toCharArray >> ${kor.toCharArray()[0]}");
            
            // Step. 한글에서 초성 추출
            // 한글 유니코드 규칙 = (초성 * 21 + 중성) * 28 + 종성 + 0xAC00
            // 초성 = (( 한글 유니코드 규칙 - 0xAC00) / 28) / 21
            // 16진수 -> 10진수 : 0xAC00 => 44032
            Log.d("FromActivity", "$kor >> ${getFirstCh(kor)}")
            Log.d("FromActivity", "$kor >> ${getFirstCh("글에서 추출 해 봅니다")}")
            Log.d("FromActivity", "$kor >> ${getFirstCh("함수를 사용한 방법입니다.")}")

        }catch(e:Exception){
            e.printStackTrace()
            Log.e("ERROR", e.localizedMessage)
        }
    }

    /**
     * @description 초성 추출
     * @param value 추출할 문자열
     */
    fun getFirstCh(value:String) : String {
        val chList = arrayOf("ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ")
    
        val first = value.substring(0, 1)              // 첫 글자 추출
        Log.d("FromActivity", "kor 초성 위치 >> $first")
        val unicode = first.codePointAt(0)                      // 유니코드로 변환
        Log.d("FromActivity", "kor 초성 위치 >> $first >> $unicode")
        val index = (unicode - 44032) / 28 / 21
        Log.d("FromActivity", "kor 초성 위치 >> $first >> $unicode >> $index")
        val result = chList[index]
        Log.d("FromActivity", "kor 초성 위치 >> $first >> $unicode >> $index >> ${result}")
    
        return result
    }
}

테스트 전체 결과

 

반응형