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바이트를 사용하는 것을 알 수 있네요.
'언어 > JAVA' 카테고리의 다른 글
[JAVA] HashSet개념과 자세한 사용방법, 예제 (0) | 2019.06.06 |
---|---|
[JAVA] 자바 Collection개념,상속도, 파생클래스들 (0) | 2019.06.06 |
[자바/JAVA] 문자열 다루기1 String 클래스 메소드 (0) | 2019.05.05 |
[자바] 파일 입출력1(FileReader, FileWriter, BufferedReader, BufferedWriter) (0) | 2018.12.23 |
[자바] 추상클래스와 인터페이스 개념과 사용방법 (0) | 2018.12.23 |