khstar

JAVA 한글 깨지는 경우 getByte로 변경 하기 본문

개발/JAVA

JAVA 한글 깨지는 경우 getByte로 변경 하기

khstar 2010. 8. 17. 16:11
반응형

위에분말이 정답이네요..

윗분말처럼 아마도 오픈소스라면.. String을 직접 사용하지 않고,

byte[]로 drawString을 할것같습니다만.. ㅎㅎ 이 byte[]를 String으로 변환시에 한글과

영어로 구분해서 변환해야 drawString시 한글이 깨지지 않고 제대로 찍힙니다.

 

아시다시피 한글은 영어와는 달리 2byte로 한문자를 표현하며, 또다른 특징으로 byte하나

하나가 모두 음수값을 가진다는 것입니다. 이런 특징을 이용해서 해당 byte[]을 String으로

만들어 내는 함수를 하나 작성해서 사용하시면 될것같습니다.

 

아래는 byte[]을 input으로 받아서 String을 output으로 반환하는 함수입니다.

물론 byte[]이 영어, 한글, 혹은 둘이 섞여있는 문장이라도 상관없이 적절한 String을

생성해서 반환합니다.

 

========================================================================

 

 public String getString(  byte[  ]  input  )

 {

             //  StringBuffer객체를 선언하여 String을 이어 붙입니다.

             StringBuffer  rtn  =  new  StringBuffer();

 

             //  byte[  ]의 길이만큼 반복해서 byte 하나 하나씩 처리합니다.                
             for(  int i = 0;  i < input.length; )

             {

                        //  한글처리부분  

                        //   (  input[  i  ]   &  0x80  )  ==  0x80 이조건을 만족하면 input[i]는

                        //  음수 즉, 한글의 두개의 byte중 첫번째 byte라는 뜻이므로

                        //  input[++i]와 함께 String으로 만들어서 한글 한글자를 생성합니다.
                         if(  (  input[  i  ]   &  0x80  )  ==  0x80  )

                         {

                                     byte[ ]  hangle  =  new  byte[  2  ];

                                     hangle[  0  ]  =  input[  i  ];

                                     hangle[  1  ]  =  input[  ++ i  ];

                                     rtn.append(  new  String(  hangle  )  );

                         }

 

                         //  한글이외 처리부분 (  영어, 숫자, 특문등등  )                            
                         else  rtn.append(  (  char  )input[  i  ]  );
                         
                         //  다음번 byte를 읽기 위해 input의 index증가시키는 부분
                         ++i;

             }

             return  rtn.toString(  );

 }

 

===============================================================

 

 

 

 

 

다음 코드는 위 함수를 test하기위한 테스트코드입니다.

 

===============================================================

 


public class byte2String


           public byte2String()
           {
                    byte[] test = "한글도 됩니다. English, too. 1234. *$*@$".getBytes(  ); 
                    System.out.println(getString(test));  
           }

          public static void main(String[] args)

          {
                    new byte2String();
          }
 
          public String getString(  byte[  ]  input  )

          {

                       StringBuffer  rtn  =  new  StringBuffer();

       
                       for(  int i = 0;  i < input.length; )

                       {
                                   if(  (  input[  i  ]   &  0x80  )  ==  0x80  )

                                   {

                                               byte[ ]  hangle  =  new  byte[  2  ];

                                               hangle[  0  ]  =  input[  i  ];

                                               hangle[  1  ]  =  input[  ++i  ];

                                               rtn.append(  new  String(  hangle  )  );

                                   }

                                   else  rtn.append(  (  char  )input[  i  ]  );
                                   ++i;

             }

             return  rtn.toString(  );

 }


}

반응형
Comments