문자집합과 인코딩, 그리고 자바

문자집합이란


  • 표현해야 할 문자를 정하고 순서를 지정한 것이다. 
  • 문자집합을 코드 형태로 표기한 것을 코드화 된 문자집합(CCS, Coded Character Set) 이라고 한다. 



인코딩 방식이란


  • CES(Character Encoding Scheme)
  • 문자집합을 컴퓨터에 저장하기 위해서 8비트 형태로 표현한 것이다. 



한글 표현 방식


  • 한글은 문자집합의 구성에 따라 조합형, 완성형, 유니코드로 나뉜다. 
  • 조합형: 한글의 제자 원리에 기반하여 초성, 중성, 종성에 각각 코드를 할당한다. 
  • 완성형: 가, 각, 값 등 완성된 문자에 코드를 할당한다. 



여러 나라의 문자를 동시에 표현하려면


  • 유니코드 사용: 전 세계적으로 사용되는 모든 문자 집합을 하나로 모은 UCS(Universal Character Set)를 정의했다. 
  • 유니코드의 인코딩 방식: UCS-2, UCS-4, UTF-7, UTF-8, UTF-16, UTF-32
  • UTF-8 인코딩을 가장 많이 사용한다. (ASCII와 호환이 가능하면서 유니코드를 표현할 수 있음)
  • UTF-8 인코딩에서 한글은 무조건 3바이트 인코딩이다. 



자바와 한글


  • Java에서 문자열은 항상 UTF-16 BE 인코딩으로 저장된다. 
  • 문자열을 입/출력할 때에만 사용자가 지정한 인코딩 값, 또는 운영체제의 기본 인코딩 값으로 문자열을 인코딩한다. 
  • JVM 기본 인코딩은 JVM 로딩 시에만 초기화되므로, 코드 중간에서 file.encoding 프로퍼티를 바꾸는 것은 아무 의미가 없다.
  • file.encoding이 지정되어 있지 않다면, OS 환경 변수(예: LANG) 값을 따른다
  • Java에서는 CP949와 EUC-KR이 사실상 같으며, 확장 완성형을 사용하기 위해서는 MS949로 지정해야 한다.
  • file.encoding은 공식 지원 프로퍼티가 아니며, 오라클 구현체 자바 라이브러리의 모든 부분을 일관성 있게 따르지도 않는다. 그러므로 file.encoding 프로퍼티는 설정하지 말아야 한다. (카이호스트만의 코어 자바 8, p331)



자바와 BOM (Byte Order Mark)


  • 일부 프로그램(MS 메모장)에서는 UTF-8로 인코드 된 파일 시작 부분에 바이트 오더 마크를 추가한다.
  • 유니코드 표준은 이를 허용한다. 인코딩에 대한 의심을 거의 남기지 않기 때문이다. 
  • 자바에서 UTF-8로 인코드 된 파일을 읽을 때는 BOM을 제거해야 한다. (카이 호스트만의 코어 자바 8, p330)



자바에서 인코딩 감지


  • 바이트 스트림에서 문자 인코딩을 자동으로 감지하는 신뢰할 만한 방법이 없다. ...... 언제나 명시적으로 인코딩을 지정해야 한다. 이를 테면 웹 페이지를 읽을 때는 Content-Type 선언부를 검사한다.
  • ISO 8859-1 같은 부분 문자 집합으로 텍스트를 쓸 때 매핑할 수 없는 문자는 모두 '대체 문자'로 변경된다. 변경되는 대체 문자는 대부분 ? 문자 또는 유니코드 대체 문자 U+FFFD다. 
  • '수정된 UTF-8' 형식을 사용하는 readUTF/writeUTF 메서드도 있다. readUTF/writeUTF 메서드는 일반 UTF-8과 호환되지 않으며, 오직 JVM 내부에서만 유용하다. 



리눅스와 한글


  • ko, ko_KR, ko_KR.eucKR: EUC-KR
  • ko_KR.UTF-8: UTF-8



참조 #1: 한글 인코딩의 이해 1편: 한글 인코딩의 역사와 유니코드
참조 #2: 한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리
참조 #3: 카이 호스트만의 코어 자바 8

댓글 쓰기

0 댓글