문자셋 인코딩에 대한 개념을 잘 모르시겠다면 이전에 올린 문자셋, 문자셋 인코딩이란? 글 에서 참고하실 수 있습니다.
자바에서 String 객체는 문자열을 유니코드로 저장합니다.
String 생성자중에 아래와 같은 것이 있습니다.
String(byte[] bytes, String charsetName)
생성자의 charsetName은 byte 배열인 bytes가 어떤 인코딩인지 생성자에게 가르쳐줍니다.
bytes의 값이 EUC-KR 인코딩 방식 바이트로 나열되어 있을때 charsetName의 값으로 "UTF-8"을 넘긴다고 해서 EUC-KR이 UTF-8로 변경되는 것이 아닙니다.
오히려 잘못된 인코딩 정보를 가르쳐 주었기 때문에 String 생성자는 EUC-KR인 bytes 값을 UTF-8로 해석하여 잘못된 유니코드 문자로 저장이 됩니다.
getBytes() 메소드를 이용하여 String 객체에 유니코드로 저장되어 있는 문자열을 바이트 배열로 구할 수 있습니다.
구해지는 바이트 배열은 인코딩에 따라 값이 다릅니다.
String str = "가";
byte[] buf = str.getBytes();
이때 getBytes() 메소드에 아무런 인수를 전달하지 않으면 플랫폼에 사용하는 기본 인코딩이 선택되어 집니다.
byte[] buf = str.getBytes("UTF-8");
이런식으로 직접 인코딩을 선택하여 바이트 배열을 구할 수 있습니다.
System.out.println()으로 출력은 JVM의 기본 인코딩에 따라 출력됩니다.
결론은 자바는 내부적으로 문자열은 유니코드로 처리되며 출력시 상황에 맞는 인코딩으로 출력이 된다는 것입니다.





최근 덧글