참고 : 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의 길이가 서로 상이한 오류를 발견해
그 부분까지 수정한 버전입니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 한글 > 영문 변환 | |
* 참고: (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]) | |
} |
반응형
'DEV > JAVA&Android' 카테고리의 다른 글
RecyclerView ItemAnimator 애니메이션 제거 (0) | 2025.02.04 |
---|---|
adb와 연결된 기기가 unauthorized 상태일 때 (2) | 2025.01.23 |
안드로이드 11 권한 자동 삭제 기능 대응(Auto Revoke Permissions) (2) | 2023.03.07 |
[Android] Android Studio 3.0에서 Layout Preview 오류 (0) | 2017.12.21 |
[Android] 다이얼로그 소프트키보드 열지 않기 (0) | 2017.11.16 |