자바 - 문자 인코딩 예제

문자 집합 조회

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