소곤소곤 ad

2014년 1월 27일 월요일

한글이 포함된 문자열의 실제 크기는 얼마일까?

한글이 포함된 문자열의 길이를 구해보자.

String s = "소곤소곤abcd";
System.out.println(s.length()); // 8

String.length()는 한글이건, 영문이건 상관없이 우리가 인지하는 글자 갯수를 돌려준다.

String s = "소곤소곤abcd";

byte[] buf = s.getBytes(); // using DefaultCharset

System.out.println(buf.length);  // 16
이 경우는, 메모리상에 위치할 실제 바이트수를 알아낼 수 있다.  잠깐! 한글은 2바이트니깐 결과값이 12일텐데 16이라고??? 12도 맞고 16도 맞다. 내 시스템의 eclipse는 UTF-8로 세팅되어 있고, 여기서 한글 한글자는 3바이트를 차지한다. 즉, 결과값은 이 코드가 동작하는 시스템의 기본 인코딩이 뭐냐에 달려있다.

문제는 실행파일(apk 혹은 jar)을 배포했는데, 그게 돌아가는 환경에 따라 이 값이 다르게 나온다는 것이다. 그래서, 시스템 비의존적인 실제 바이트수를 알아낼 필요가 있다.

이때 쓸 함수가 getBytes(String EncodingCharsetName)이다.
String s = "소곤소곤abcd";
System.out.println(s.getBytes("UTF-8").length);
하지만 그냥은 런타임에러가 난다. 엔코딩실패를 대비해서 try catch로 감싸주어야 한다. 함수로 만들어 보았다.
public int getRealSize(String text)
{
    int size = -1;
    try {
        size = text.getBytes("UTF-8").length;
    } catch (UnsupportedEncodingException e1){
    
    }

    return size;
}

이종시스템간 데이터교환 (특히 클라이언트-서버방식의 게임)에서는 항상 주의해야 한다.