관리 메뉴

nkdk의 세상

Java, 한글이 포함된 문자열을 byte 크기로 잘라내기 본문

My Programing/JAVA

Java, 한글이 포함된 문자열을 byte 크기로 잘라내기

nkdk 2009. 6. 25. 23:33

한글은 대부분 2 byte로 저장된다. (unicode제외하면.) 게시판에서 제목을 보여줄 경우, 제목이 너무 길 경우 중간에 잘라버리고 "제목..." 형식으로 표시해 주곤 하는데, 이때 한글과 영문,숫자가 혼용될 경우 byte길이로 자르기가 애매하다. 그냥 byte 길이로 싹뚝 잘라버릴 경우 한글이 깨질 수도 있기 때문이다.

그래서, 만약 마지막 byte가 한글의 허리부분이라면 byte수를 하나 늘이던가(한글자 더 출력) 줄여서(한글자 덜 출력) 마지막 글자가 제대로 표시되도록 해야 한다.

매번 관리자 페이지만 만들다가 오랫만에 사용자 페이지 작업을 하니 이런것도 해 보네.
일반적인 ascii 문자가 아닌 경우 byte값이 음수로 나타난다. 제대로 한다면 아래와 같을 것이다.
if 마지막 byte가 1 byte 문자를 나타내는 것이 아니라면
then
    if 만약 이게 multi byte character의 끝이라면 그냥 처리
    else if 만약 이게 multi byte 중간이라면
        이전(혹은 이후) character 끝 부분 찾아서 거기까지 return
else 그냥 처리!


대충 한다면 아래와 같을 것이다.
일단, 그냥 문자들은 1 byte 아니면 2 byte 라고 가정하자. 2 byte 문자들의 개별 byte 값은 음수로 나온다.
원하는 byte 수 만큼 자른 byte들 내부에서 전체 음수 byte 값을 찾자. 짝수면 ok, 홀수면 마지막 문자가 허리가 잘렸다.
허리가 잘렸다면, 길이를 1 늘여서 완성시켜 주던지, 1 줄여 그 문자를 버리자.


대충하는 방법을 java 코드로 하면 아래와 같다.

 public String getShortString( String orig)
 {
    byte[] byteString = orig.getBytes();
    int length =  50;

    if (byteString.length <= length)
    {
      return orig;
    }
    else
    {
      int minusByteCount = 0;
      for (int i = 0; i < length; i++)
      {
        minusByteCount += (byteString[i] < 0) ? 1 : 0;
      }

      if (minusByteCount % 2 != 0)
      {
        length--;
      }

      return new String(byteString, 0, length) + "...";
    }
  }


출처: http://kingori.egloos.com/2726263