문자셋 인코딩에 대한 개념을 잘 모르시겠다면 이전에 올린 문자셋, 문자셋 인코딩이란? 글 에서 참고하실 수 있습니다.
자바에서 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의 기본 인코딩에 따라 출력됩니다.
결론은 자바는 내부적으로 문자열은 유니코드로 처리되며 출력시 상황에 맞는 인코딩으로 출력이 된다는 것입니다.
자바에서 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의 기본 인코딩에 따라 출력됩니다.
결론은 자바는 내부적으로 문자열은 유니코드로 처리되며 출력시 상황에 맞는 인코딩으로 출력이 된다는 것입니다.




최근 덧글