본문 바로가기

major/Android

[Kotlin] String to UTF8 변환하기

16진수 번역기

Kotlin으로 "16진수 번역기"라는 안드로이드 앱을 개발, 출시했습니다.

Covid19 이슈 때문에 검토가 지연된다고 했지만, 앱 자체가 큰 기능이 없어서인지 이틀만에 승인이 났습니다.

Get it on Google Play

앱이 출시된 지 얼마 안 돼서, 아직까지는 16진수 번역기라고 쳐도 앱이 나오지 않습니다ㅠ_ㅜ

16진수 번역기를 검색했을 때 바로 안나온다면, "pub:hello alpaca"를 검색해주세요!

그러면 제가 출시한 모든 앱들이 나옵니다 :D

 

이번 포스팅에서는 앱의 핵심 기능인 문자열을 UTF8로 변환하는 방법과 UTF8을 문자열로 변환하는 방법을 정리했습니다.

 

1. String to UTF8

"안"이라는 글자를 UTF8로 변환하면 "ec9588"이라는 16진수 문자 6개로 표현이 가능합니다.

 

Kotlin에서는 원하는 Character Set으로 변해주는 toByteArray()함수를 지원합니다.

String 값을 ByteArray 값으로 반환합니다.

 

"안"을 UTF8로 변환한 toByteArray의 값을 찍어보면 -20, -107, -120이 출력됩니다.

16진수 값으로 출력하기 위해 %02X 포맷으로 변환해주면, EC9588이란 값이 찍힙니다.

var str = "안"
var result = ""
var temp = str.toByteArray(Charsets.UTF_8)

for (b in temp) {
    val st = String.format("%02X", b)
    result += st
}

 

2. UTF8 to String

EC9588이란 UTF8 문자열을 "안"이라는 값으로 변환해주기 위해서 ByteBuffer를 사용합니다.

EC, 95, 88 두자리씩 나눠서 ByteBuffer에 넣어준 뒤 UTF8로 디코딩합니다.

var str = "EC9588"
var result = ""
var buff = ByteBuffer.allocate(str.length / 2)
for (i in 0..str.length - 1 step 2) {
	buff.put(Integer.parseInt(str.substring(i, i + 2), 16).toByte())
}
buff.rewind()
var cs = Charsets.UTF_8
result = cs.decode(buff).toString()

 

3. Kotlin 정규표현식

UTF8 to String을 하기 위해서는 0~9, A~F사이의 문자만 들어가야 합니다.

0~9, A~F 사이의 문자가 아닌 다른 문자를 넣고 UTF8 to String 변환을 시도하면 에러가 나서 앱이 종료됩니다.

 

이러한 일을 방지하기 위해서는 알맞은 문자를 입력했는지 확인해야 합니다.

정규표현식을 사용하면 간단하게 해결할 수 있습니다.

0~9, A~F가 아닌 다른 문자가 있거나 입력한 문자가 2의 배수개가 아니라면 "16진수가 아닙니다?"라는 에러메시지를 반환하도록 만들었습니다. 

if(str.length%2==1)
	return "16진수가 아닙니다."

val regex = Regex(pattern = "[a-fA-F_0-9]*")
if(!str.matches(regex))
	return "16진수가 아닙니다."

 

 

항상 Java로만 앱을 개발하다가, 처음으로 Kotlin으로 개발, 출시를 해봤습니다.

아주 간단한 앱이지만 출시했다는 것 자체로도 기쁘네요!

소스 전체를 제 깃허브 hexTranslator라는 이름으로 업로드했습니다.

MIT 라이센스로 올렸으니 필요하신 분들은 가져다 쓰시면 됩니다.

 

업데이트 계획으로는 SNS쉐어, 변환한 문자들을 DB에 저장했다가 한꺼번에 보여주는 기능을 추가할 생각입니다.

좋은 아이디어나, 원하는 기능이 있다면 언제든지 댓글남겨주세요.


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D