본문 바로가기
개발/Android

이모지 유니코드로 변환하기

by 준그래머 2024. 9. 26.
반응형

문제 사항

이모지는 Surrogate Pair 문자로 16비트 코드 2개로 이루어진 문자다. 때문에 기존 1개로 이루어진 문자처럼 변환할 경우 변환된 문자의 개수가 맞지 않는 현상이 발생한다.

 

때문에 주소록 앱에서 이모지 이름으로 저장된 경우 이모지로 검색 시 제대로 불러오지 못하는 경우가 생겼고 이 문제를 해결하는 과정에서 얻은 정보를 토대로 이 게시글을 적게 되었다.

 

구현

public static String normalize(String name) {
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < name.length(); i++) {
        int codePoint = name.codePointAt(i); 
        if(Character.charCount(codePoint) == 2){
            i++;
        }
        sb.append("U+" + Integer.toHexString(codePoint).toUpperCase());
        if(i < name.length() -1) {
            sb.append(" ");
        }      
    }
    return sb.toString()
}

normalize라는 파라미터 name을 유니코드로 변환하는 함수를 구현해 보았다.

 

코드 분석

int codePoint = name.codePointAt(i);

은 해당 문자의 유니코드를 가져오는 함수로 10진수로 이루어진 값을 가져온다.

 

if(Character.charCount(codePoint) == 2){
    i++;
}

해당 문자가 Surrogate Pair 인지 확인하고 true라면 다음 문자를 넘기기 위해 인덱스를 하나 증가 시킨다.

 

sb.append("U+" + Integer.toHexString(codePoint).toUpperCase());
if(i < name.length() -1) {
    sb.append(" ");
}

StringBuilder에 접두사 U+가 붙은 16진수의 유니코드를 추가한다. 이때, 소문자를 다 대문자로 변환해 준다. 마지막 문자가 아니라면 공백을 추가해 준다.

 

결과

파라미터로 "😊Aㄱ1"를 넣어서 확인해 본 결과 U+1F60A U+41 U+3131 U+31로 변환되는 것을 확인했다. 또한 코드로 적용해 테스트해보았고 정상 동작하는 것을 확인했다.👍