자바 - 문자 인코딩 예제
문자 집합 조회
public static void main(String[] args) {
//이용 가능한 모든 Charset, 자바 + OS
SortedMap<String, Charset> charsets = Charset.availableCharsets();
for (String charsetName : charsets.keySet()) {
System.out.println("charsetName = " + charsetName);
}
System.out.println("=======================================");
//문자로 조회(대소문자 구분 X)
Charset ms949 = Charset.forName("MS949");
System.out.println("ms949 = " + ms949);
System.out.println("=======================================");
//별칭 조회
Set<String> aliases = ms949.aliases();
for (String alias : aliases) {
System.out.println("alias = " + alias);
}
System.out.println("=======================================");
//UTF-8 문자로 조회
Charset utf8 = Charset.forName("UTF-8");
System.out.println("utf8(문자 조회) = " + utf8);
//UTF-8 상수로 조회
utf8 = StandardCharsets.UTF_8;
System.out.println("utf8(상수 조회) = " + utf8);
System.out.println("=======================================");
//현재 시스템에서 사용하는 기본 문자 집합
Charset defaultCharset = Charset.defaultCharset();
System.out.println("defaultCharset = " + defaultCharset);
}UTF-8과 같이 자주 사용하는 문자 집합은 StandardCharsets에 상수로 지정되어 있다.
인코딩 예제 - 1
문자를 컴퓨터가 이해할 수 있는 숫자(byte)로 변경하는 인코딩을 할 때는 중요한 점이 있는데, 문자를 byte로 변경하려면 반드시 문자 집합이 필요하다는 점이다.
String.getBytes()는 인자가 없는 메서드를 포함해서 다양한 방식으로 문자 집합을 인자로 받도록 오버로딩 되어 있는데, 문자 집합을 지정하지 않으면 현재 시스템에서 사용하는 기본 문자 집합을 인코딩에 사용한다.
영문의 경우, UTF-16은 ASCII와 호환되지 않아 2byte를 사용하는 것을 알 수 있다.
한글의 경우, EUC-KR과 MS949(CP949)는 한글 인코딩에 2byte를 사용하고 같은 값으로 인코딩한다.
EUC-KR을 확장해서 만든 것이 MS949(CP949)이다.
인코딩 예제 - 2
영문 ASCII 인코딩
ASCII는 UTF-16을 제외한 대부분의 문자 집합에 호환된다.
한글 인코딩 - 기본
한글은 ASCII, ISO-8859-1로 인코딩할 수 없다.
그 외 문자 집합은 모두 한글 인코딩, 디코딩이 잘 수행되는 것을 확인할 수 있다.
그리고 EUC-KR, MS949 모두 같은 값을 반환하는 것을 확인할 수 있다.
한글 인코딩 - 복잡한 문자
EUC-KR은 자주 사용하는 한글 2,350개만 표현할 수 있기 때문에, 복잡한 문자는 인코딩할 수 없다.
한글 인코딩 - 디코딩이 다른 경우
'쀍'과 같이 특수한 한글은 MS949로 인코딩 할 수 있지만, EUC-KR 문자 집합에 없으므로 EUC-KR로 디코딩할 수 없다.
한글을 인코딩할 때 UTF-8과 EUC-KR(MS949)은 서로 호환되지 않는다.
영문 인코딩 - 디코딩이 다른 경우
ASCII에 포함되는 영문은 UTF-16을 제외한 대부분의 문자 집합에서 호환된다.
한글이 깨지는 가장 큰 2가지 이유
EUC-KR(MS949) 과 UTF-8이 서로 호환되지 않는다.
UTF-8로 인코딩한 한글을 EUC-KR(MS949) 로 디코딩하거나, EUC-KR(MS949) 로 인코딩한 한글을 UTF-8로 디코딩하는 경우
EUC-KR(MS949) 또는 UTF-8로 인코딩한 한글을 한글을 지원하지 않는 ISO-8859-1로 디코딩 하는 경우
Last updated