Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


Extract unicode from ASCII format text
 
유니코드를 이용하여 해당 스트링의 값을 추출하여, encoding 작업과 decodind작업을 하도록 한다. 보통 jad로 decompile할경우 특정charset에 대하여 \uXXXX가 붙게된다. more.. ( 2003/02/28 ) 95
Written by ienvyou - 최지웅
1 of 1
 
<font face='굴림'>우선 왜 이런 코드를 작성했는지 생각해 볼수 있다. 언젠가 이러한 질문이
들어온적이 있다. Decompiler를 이용하여 작성된 파일에 한글코드가 \uXXXX형태로 
들어가있는 것을 보게 된다. 이럴때 주석이나 어떤 코드들을 확인할수 없기 때문에
해당 Unicode를 한글로 다시 바꿀수 있는 방법이 없느냐에 관한 것이었다.

www.unicode.org에 가면 해당 codeset에 대한 특징 및 각 나라의 언어에 대한 unicode를
받아서 설치할수 있는 파일들을 제공하고 있다.

이러한 유니코드로는 모든 나라의 언어를 표현할수 있으며, 또한 내용또한 광범위하므로
점차 많은 벤더들이 사용하고 있지만, 아직까지 대다수가 쓰는 범용코드 형태가 아니다.

우선 프로그램을 본후 이야기 하자.
아래의 프로그램은 간단하게 \uXXXX가 포함된 코드를 찾는 클래스파일이다.

import java.util.*;
import java.io.*;
class  UnicodeToHangul {
public static void main(String[] args) throws Exception{
    BufferedReader br = new BufferedReader(new FileReader("SQLArrayTest.jad"));
    String str = null;
    StringBuffer sb = new StringBuffer(1000);
    while( (str = br.readLine()) != null) {
	sb.append(str + "\n");
    }


    String unicode = "";
    for(int i = 0 ; i < sb.length() ; i++){
	int c = sb.charAt(i);
	//if(Character.isUnicodeIdentifierPart(c))	System.out.print(c + "/");
	if(c == 92) {
	    for(int j = 0 ; j < 6 ; j++){
		unicode += sb.charAt(i++);
	    }
	    System.out.println("unicode find : " + unicode);
	    unicode="";
	}
	
    }
    //System.out.println(sb.toString());

    Unicoder uni  = new Unicoder();
    System.out.println(uni.decode(sb.toString()));

    
    
    br.close();
}
}

테스트는 역컴파일된 jad파일을 이용했으며, 그안에 어떤 코드가 들어가 있는지 
확인하기 위함이었다. 그 파일을 보게 되면 

    System.out.println("\uD589 " + i + " : ");
    ARRAY array = ((OracleResultSet)resultset).getARRAY(1);
    System.out.println("\uBC30\uC5F4\uD0C0\uC785 " + array.getSQLTypeName());

처럼 한글부분이 \uBC30처럼 나타난다는 것을 볼수 있다.

사실 모든 java파일을 이용하여 charAt()메소드를 이용하여 영문자를 확인해보면 결국 
\u0030의 형태로 나타나게 된다. 
유니코드는 앞의 charset 127개부분을 ASCII형태로 포함시켜 사용하고 있다.

public static String encode( String ascii){
  StringBuffer uniString = new StringBuffer();
  String tempString = null;
  for( int i=0 ; i < ascii.length() ; i++){
	tempString = Integer.toHexString( ascii.charAt(i) );
	uniString.append( 
	"\\u"+(tempString.length()==4 ? tempString : "00" + tempString ) );
  }
  return uniString.toString();
}
public static String decode( String unicode){
  StringBuffer str = new StringBuffer();
    for( int i= unicode.indexOf("\\u") ; i > -1 ; i = unicode.indexOf("\\u") ){
	System.out.print("  " + i);
	str.append( unicode.substring( 0, i ) );
	str.append( 
	   String.valueOf( (char)Integer.parseInt( unicode.substring( i + 2, i + 6 ) ,16) ) 
	);
	unicode = unicode.substring( i +6);
    }
    str.append( unicode );
    return str.toString();
}

따라서 영문자의 경우 127개의 ascii의 안에 있기때문에 charAt()으로 
변환시킨 문자가 4bit + 4bit, 즉 8bit형태로 나오게 되는데 2byte체계의 unicode에서는 앞부분의
내용을 00으로 채우게 된다.
위의 encode메소드가 그러한 역할을 해주며, decode의 경우 해당 스트링의 값에 대하여
\\u로서 escape character를 찾아낸후 이후 unicode.substring( i + 2, i + 6 )로 \u까지의 
내용을 자른후 radix 16을 취하여 바꾸게 되면 다시 원래의 문자들로 변환이 되게 된다.
모든 체계를 일정한 규칙을 가지고 있으며 그러한 방법을 알게 되면 알고리즘으로
해결해 낼수 있는 내용들이 많다..


 
1
References
 
http://www.unicode.org
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD