기록공간

문자 집합 (Character Set) 본문

Java

문자 집합 (Character Set)

입코딩 2020. 8. 31. 21:04
반응형

개요

컴퓨터는 모든 정보를 1과 0으로 인식한다. 어떠한 정보를 컴퓨터가 알 수 있게 변환해주는 작업을 인코딩이라고 한다. 반대로 1과 0으로 이뤄진 정보를 우리가 원하는 정보로 보기 위해서는 디코딩이라는 작업이 필요하다. 이러한 인코딩과 디코딩을 하기 위해서는 서로간의 약속이 필요하다. 그렇지 않으면 정보를 주고받는 과정에서 원하는 결과를 얻을 수 없기 때문이다. 문자 정보를 주고 받는 과정에서 이러한 약속을 문자 집합이라고 한다. 문자 집합을 서로 맞춰주지 않으면 정보를 주고받는 과정에 장애가 생긴다. 이러한 문자 집합에는 어떤 종류가 있는지 살펴보자. 

 

유니코드(Unicode)

유니코드는 국제 표준으로 제정된 2바이트계의 만국 공통 국제 문자부호체계(Universal Code System. UCS)이다. 애플컴퓨터, IBM, 마이크로소프트 등이 컨소시엄으로 설립한 유니코드(Unicode)가 1990년에 첫 버전을 발표하였고, ISO/IEC JTC1 에서 1995년 9월 국제표준으로 제정하였다. 공식 명칭은 ISO/IEC 10646-1

(Universal Multiple-Octet Coded Character Set)이다.

 

데이터 교환을 원할하게 하기 위해 문자 1개에 부여되는 값을 16비트로 통일하였다. 코드의 1문자당 영어는 7비트, 비영어는 8비트, 한글이나 일본어는 16비트의 값을 가지게 되는데 이들을 모두 16비트로 통일한 것이다.

 

UTF-8 과 UTF-16

UTF-8 과 UTF-16의 차이를 한 마디로 말하면 문자를 표현할 때의 단위가 다르다는 것이다. UTF-8은 8비트 가변장 멀티바이트에서 문자를 표현하고, UTF-16은 16비트 가변장 멀티바이트에서 문자를 표현한다.

 

- UTF-8(8Bit UCS Transformation Format)

웹에서 기본적으로 사용하는 코드이다. UCS-2로 정의되는 문자 집합을 이용하여 기술된 문자열을 바이트 열로 변환하는 방식의 1개 1문자를 1~6바이트 가변장 멀티바이트로 변환한다.

 

- UTF-16(16Bit UCS Transformation Format)

자바의 기본 코드이다. 자바에서는 문자 하나를 저장하면 바이트 수는 영문자이든, 한글문자이든 2바이트를 차지하게 된다. UCS-2로 정의되는 문자 집합을 이용하여 기술된 문자열에 UCS-4의 일부 문자를 채워넣기 위한 인코딩 방식이다. UTF-8과 병용할 수 있으며, UCS-2로 이용할 수 있는 문자수를 대폭 늘릴 수 있다.

 

사용하는 곳에 따라 서로 알맞은 포맷을 사용해야 하기 때문에 경우에 따라 변환해야 하는 상황이 발생할 수 있다. 

 

문자 코드의 종류

  • KSC5601

    • 한글완성형 표준 (한글 2350자 표현)

    • 한국공업표준 정보처리분야(C)의 5601번 표준안

  • KSC5636

    • 영문자에 대한 표준

    • 한국공업표준 정보처리분야의 5606번 표준안

    • 기존 ASCII Code에서 역슬래시를 원(\) 표시로 대체 

  • EUC-KR(MS949) - ANSI

    • Bell 연구소에서 유닉스 상에서 영문자 이외의 문자를 지원하기 위해 제안한 확장 유니코드(Extend UNIX Code) 중 한글 인코딩 방식

    • 영문은 KSC5636으로 처리하고, 한글은 KSC5601로 처리된다.

    • EUC-KR(MS949) = KSC5636 + KSC5601

  • UTF-8

    • 영문과 숫자는 1바이트, 한글은 3바이트로 표현

    • 웹에서 많이 사용된다. (JSP를 작성할 때에는 파일로 UTF-8 형식으로 저장해야 한다)

  • UTF-16

    • 자바 기본 문자 코드

    • 영문과 숫자는 1바이트, 한글은 2바이트로 표현

  • ISO-8859-1

    • 서유럽 언어 표기에 필요한 US-ASCII에 없는 94개의 글자의 순차적 나열

String 클래스

String 클래스는 이러한 문자 집합 포맷 기능들을 제공한다. 

 

getBytes() 메서드

String name = new String("윤홍준");

buf = name.getBytes();

for(byte b : buf)                     
	System.out.println("[" + b + "]");
    
System.out.println();                 
//--==>> [-64]                        
//	 [-64]                        
//	 [-79]                        
//	 [-56]                        
//	 [-85]                        
//	 [-63]                        
//	 [-40]                        

getBytes() 메서드는 객체에 들어있는 문자열을 원하는 문자 집합을 기준으로 바이트 배열을 반환해준다. 인자로 "utf-8", "euc-kr" 등을 입력하면 그 포맷에 맞게 변환해준다. 인자로 아무것도 입력하지 않으면 컴퓨터 시스템 기본 문자 집합으로 변환해준다.

 

생성자

String str = new String(바이트배열, 인코딩방식);

객체 생성시 생성자에 String으로 변경할 바이트의배열과 인코딩방식을 넣어주면 그 포맷에 맞춰 변환된 문자열로 만들어준다. 

 

주의할점

String name = new String("test");

System.out.println();                                         
String convert = new String(name.getBytes("euc-kr"), "utf-8");
                                                              
System.out.println("Value3 : " + convert);                    
//--==>> Value3 : ?????                                       
                                                              
buf = convert.getBytes();                                     
System.out.println("Length : " + buf.length);                 
//--==>> Length : 5                                           
                                                              
buf = convert.getBytes("utf-8");                              
System.out.println("Length : " + buf.length);                 
//--==>> Length : 14                                          

euc-kr을 utf-8로 변환하겠다는 의도로 위와 같이 코딩을 하면 안된다. 이러한 변환으로 바이트 배열이 깨져버린다. 어떠한 바이트 배열로 읽어오든 깨져있는 것을 확인할 수 있다. 또한 이미 깨져서 생성된 String 객체의 바이트 배열은 어떤 방식으로든 복구가 불가능하다.

 

반응형

'Java' 카테고리의 다른 글

예외 처리(Exception Handling)  (0) 2020.09.01
Java의 주요 클래스(3)  (0) 2020.09.01
Java의 주요 클래스(2)  (0) 2020.08.27
Java의 주요 클래스(1)  (0) 2020.08.26
클래스 고급 - 중첩 클래스(내부 클래스)  (0) 2020.08.25
Comments