본문 바로가기

DEV/JAVA&Android

[Kotlin] 한글 영문 변환(kor2eng)

참고 : https://github.com/20chan/eng2kor/blob/master/eng2kor/eng2kor.py

 

GitHub - 20chan/eng2kor: 파이썬으로 한영타변환

파이썬으로 한영타변환. Contribute to 20chan/eng2kor development by creating an account on GitHub.

github.com

파이썬으로 된 코드를 참고해 kotlin 버전으로 포팅했습니다.

 

참고한 코드에서 딸기 입력시 null로 잘못 변환되는 오류가 있어 확인해보니 KORS변수에 쌍디귿이 없어서 KORS와 ENGS의 길이가 서로 상이한 오류를 발견해

그 부분까지 수정한 버전입니다.

 

/**
* 한글 > 영문 변환
* 참고: (https://github.com/20chan/eng2kor/blob/master/eng2kor/eng2kor.py)
*/
const val BASE_CODE = 44032
const val CHO_CODE = 588
const val JUNG_CODE = 28
const val MAX_CODE = 55203
val CHO_LIST = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ".toList()
val JUNG_LIST = "ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ".toList()
val JONG_LIST = " ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ".toList()
val KORS = "ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ".toList()
val ENGS = listOf("r", "R", "rt", "s", "sw", "sg", "e", "E", "f", "fr", "fa", "fq", "ft", "fx", "fv", "fg", "a", "q", "qt", "t", "T", "d", "w", "c", "z", "x", "v", "g", "k", "o", "i", "O", "j", "p", "u", "P", "h", "hk", "ho", "hl", "y", "n", "nj", "np", "nl", "b", "m", "ml", "l")
val KOR_ENG_TABLE = KORS.zip(ENGS).toMap()
fun kor2eng(text: String): String {
val res = StringBuilder()
for (ch in text) {
val s = ch.split()
if (s == null) {
res.append(ch)
} else {
val en = s.joinToString("") {
(if (it != ' ')
KOR_ENG_TABLE[it]
else "").toString()
}
res.append(en)
}
}
return res.toString()
}
fun combine(cho: Char, jung: Char, jong: Char): Char {
var res = BASE_CODE
res += if (cho == ' ') 0 else CHO_LIST.indexOf(cho) * CHO_CODE
res += if (jung == ' ') 0 else JUNG_LIST.indexOf(jung) * JUNG_CODE
res += JONG_LIST.indexOf(jong)
return res.toChar()
}
/***
* Char.split()
* 한글문자 자소 분리
*/
fun Char.split(): CharArray? {
val code = this.code - BASE_CODE
if (code < 0 || code > MAX_CODE - BASE_CODE) {
if (this == ' ') return null
if (this in CHO_LIST) return charArrayOf(this, ' ', ' ')
if (this in JUNG_LIST) return charArrayOf(' ', this, ' ')
if (this in JONG_LIST) return charArrayOf(' ', ' ', this)
return null
}
return charArrayOf(CHO_LIST[code.floorDiv(CHO_CODE)], JUNG_LIST[(code % CHO_CODE).floorDiv(JUNG_CODE)], JONG_LIST[(code % CHO_CODE) % JUNG_CODE])
}
view raw kor2eng.kt hosted with ❤ by GitHub
반응형