String을 왜 인코딩하고 디코딩할까요? 인코딩과 디코딩을 해야하는 상황이 있습니다. 만일 DB가 한글을 지원하지 않는 경우 한글로 된 문자를 숫자로 encoding해서 DB에 저장하면 되고, 사용자에게 보여줄때는 다시 decoding해서 보여주면 됩니다.

또는 암호화할때 문자열을 encoding한 후에 암호화하게 됩니다.

이 밖에도 문자열을 encoding과 decoding을 해야할 상황이 있겠죠? 그러므로 문자열을 어떻게 encoding할지 decoding할지 알아보도록 하겠습니다.

 

byte[] getBytes()

byte[] getBytes(Charset charset)

byte[] getBytes(String charsetName)

문자열을 인코딩된 byte형태로 넘겨줍니다. 매개변수없이 그냥 getBytes()메소드를 사용하면 플랫폼에 따른 default charset을 사용합니다.

만일 특정 charset을 지정할 경우 인자를 받는 getBytes메소드를 사용하면 됩니다. ISO-8859-1, euc-kr, utf-8 등의 charset이 존재하는데 encoding과 decoding할때 이 chatset을 맞춰서 해야합니다. 그러지 않을 경우 문자가 깨지는 현상이 발생하게 됩니다. 

 

자, 그러면 이제 실제 프로그램을 짜면서 사용법을 알아보도록 합시다. 여기서는 가장 많이 사용하는 UTF-8로 charset을 지정했습니다.

public static void main(String[] args){
	String str="reakwon의 블로그";
	//default charset으로 인코딩된 바이트 배열	
	byte[] bytes=str.getBytes();
    //인코딩된 바이트 출력
	System.out.print("Default charset encoding: ");
	for(int i=0;i<bytes.length;i++)
		System.out.print(bytes[i]+" ");
	System.out.println();
	//default charset으로 디코딩된 문자열 출력
	String decoded=new String(bytes);
	System.out.println(decoded);
		
	System.out.println();
	try {
    	//UTF-8로 인코딩된 바이트 배열
		bytes=str.getBytes("UTF-8");
		System.out.print("UTF-8 charset encoding: ");
		for(int i=0;i<bytes.length;i++)
			System.out.print(bytes[i]+" ");
		System.out.println();
        //이 바이트 배열을 default charset으로 디코딩된 문자열 출력 : charset이 다르므로 한글이 깨짐.
		decoded=new String(bytes);
		System.out.println(decoded);
		//인코딩된 UTF-8로 디코딩되어 한글이 깨지지 않음.
		decoded=new String(bytes,"UTF-8");
		System.out.println(decoded);
			
	} catch (UnsupportedEncodingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

 

문자열은 한글이 섞여있는 문자열입니다. 우선 default charset으로 바이트 배열을 얻어오고 출력해줍니다. 인코딩된 바이트 배열을 다시 디코딩하여 출력해줍니다. String으로 decoding하는 방법은 무척 간단합니다. 아래의 String 클래스의 생성자를 사용하면 됩니다.

 

 

String(byte[] bytes) : default charset으로 decoding한 문자열

String(byte[] bytes, String charsetName) : 특정 charset으로 decoding한 문자열

 

try...catch 안에서는 UTF-8로 인코딩하고 인코딩된 값을 출력해줍니다. 그 이후 String 인코딩 된 값을 출력해주는데요. 만약 default charset으로 디코딩한 후 문자열을 출력하면 어떻게 될까요? 예상하셨겠지만 영어를 제외한 한글을 깨져서 나옵니다.

그래서 인코딩된 방식과 같이 UTF-8로 디코딩해야합니다. 그래야만 한글이 깨지지 않지요. 그래서 바로 위의 String의 2번째 생성자를 사용해서 charset을 지정합니다. 그 후 출력하면 정상적으로 한글이 출력됩니다.

결과를 확인해보세요.

 

결과

Default charset encoding: 114 101 97 107 119 111 110 -64 -57 32 -70 -19 -73 -50 -79 -41 
reakwon의 블로그

UTF-8 charset encoding: 114 101 97 107 119 111 110 -20 -99 -104 32 -21 -72 -108 -21 -95 -100 -22 -73 -72 
reakwon?쓽 釉붾줈洹?
reakwon의 블로그

 

결과를 들여다보면 영어는 ASCII, 그리고 한글은 2바이트를 사용하는 것을 알 수 있네요.

반응형
블로그 이미지

REAKWON

와나진짜

,