개발 창고/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
}
}
반응형