기기

Unicode와 encoding 본문

기술

Unicode와 encoding

notEmpty 2020. 9. 9. 23:42

정의

문자 집합(Character Set)은 정보를 표현하기 위한 글자나 기호들의 집합을 정의한 것입니다.

이런 문자나 기호의 집합을 컴퓨터에서 저장하거나 통신에 사용할 목적으로 부호화 하는 것을 문자 인코딩(부호화)이라 하고 인코딩 된 문자 부호(Character code)를 다시 디코딩(복호화)하여 본래 문자나 기호로 표현할 수 있습니다.

Character Set → ( 인코딩 ) → Character Code → ( 디코딩 ) → Character Set

 

 

한글 인코딩 

한글 표현(또는 작성 형태)에 따라 조합형과 완성형으로 나뉩니다.

  • 조합형: 한글을 초성,중성, 종성으로 나누어 각각 1byte씩 총 3byte로 표현
     
  • 완성형: 문자표를 토대로 문자를 인식합니다. 만약 문자표에 없으면 표현할 수 없는 단점이 있습니다. 

 

1980년 초기 회사마다 인코딩 방식이 달라 글자가 깨지는 현상이 발생했습니다. 그래서 정부에서 완성형 한글을 표준(KS_C_5601_1987)을 제정하게 되었습니다. 하지만 여전히 완성형이 표현 못하는 글자들이 있기 때문에,

기존 KSC5601 완성형과 함께 조합형 한글을 함께 수용할 수 있는 KSC5601-92(KSC5601)를 표준으로 제정하여 현재까지 사용하고 있습니다.

 

1. ksc5601과 CP949

ksc5601, cp949은 문자셋이기는하나, 각각 조금은 다른 인코딩 방법을 가지고 있습니다.
그래서 문자셋이나 인코딩 방법을 따로 구분해서 부르기 힘들고, 각각 통칭하여 EUC-KR과 CP949(혹은 EUC-KR 확장)이라고 불리웁니다.

원래 윈도우는 CP949방식을 사용했는데, 윈도우를 개발한 마이크로 소프트에서 EUC-KR 방식에서 확장하였기 때문에 MS949라고도 부릅니다. 참고로 현재는 윈도우가 유니코드도 지원하며, 요즘 개발되는 윈도우는 유니코드를 베이스로 하고 있다고 합니다. 

 

2. UTF (Unicode Transformation Format)

유니코드는 문자셋(Character Set)인 UCS(Universal Character Set)과 그 인코딩 방법(유니코드 인코딩)들의 통칭입니다. 즉 키와 값이 1:1로 매핑된 형태의 코드입니다. 

4byte로구성되어 있기 때문에 사용하는 코드 범위에 따라서 1~4byte로 변환이 가능하게 됩니다.

UTF-7, UTF-8, UTF-16BE, UTF-16LE등의 종류가 있습니다. 

 

유니코드의 한글은 완성형 코드와 조합형 코드를 모두 가지고 있습니다.

그리고 완성형 코드도, 초성을 z축으로, 중성을 x축으로, 종성을 y축으로 구성하여, 코드 하나에 대해 간단한 산술연산으로 초성/중성/종성으로 분리해낼 수 있습니다.

대부분의 platform world에서는 완성형 형태의 코드를 사용합니다. 그것을 NFC(완성형)라고 합니다. 초성/중성/종성으로 구분된 코드를 조합하여 한글을 표현하는 방법을 NFD(조합형)라고 하는데, 거의 맥/iOS의 파일 시스템에서만 유일하게 사용됩니다.

그래서 제대로 transcoding 해주지 않는 전송 프로그램이나 압축 프로그램을 사용하여 맥에서 윈도로 파일을 전송하는 경우 아래와 같이 한글이 풀리는 문제가 있습니다.

 

추가로.. 
BOM(Byte Order Mark)이라는 것이 있습니다. 이것은 바이트 스트림의 특정 부분에 삽입되는 3바이트의 마크로, 이후 문서의 끝까지 혹은 다음 BOM까지는 이 유니코드 인코딩을 사용하겠다. 라고 명시합니다.

그런데, 기본적으로 UTF-8을 사용하는 리눅스/맥에서는 이 BOM을 생략합니다. 즉, 문서 저장시 파일의 어느 부분에도 BOM이 포함되지 않습니다.

윈도는 기본적으로 유니코드로 파일을 저장할 때 BOM을 파일의 첫머리에 넣어둡니다. (explorer에서 파일에 오른쪽 버튼을 눌러 상세정보에 들어가면 BOM을 제거할 수 있는 방법이 있습니다.)

그래서 이러한 처리를 제대로 못하는 앱으로 윈도에서 저장된 유니코드 파일을 리눅스/맥에서 읽으면 역시 엉망으로 읽힙니다.

 

3. EUC

euc는 extend unix code의 약자로 유닉스에서 영어를 제외한 문자를 표시하기 위한 확장 부호를 의미합니다. 그 중 euc-kr은 한글 표현을 위한 문자 인코딩인데, 영문은 KSC5636(ASCII와 동일하나 역슬래쉬를 원표시로 대체)으로 처리하고 한글은 KSC5601로 처리합니다.

현재의 euc-kr은 KSC5601-92로 완성형부터 조합형 한글까지 사용 가능합니다.

 

4. CP949

마이크로소프트에서 사용하는 한글 문자의 부호표입니다. MS-window에서 한글 표현을 위해 채용하면서 MS949로 불리우기도 합니다.

처음 CP949는 KSC5601에 표현된 2350자만을 제공하였으나 KSC5601-92가 제정되면서 조합형 한글에 대한 부호표도 추가되어 제공되고 있습니다.

 

 

결론

KSC5601 vs EUC-KR vs CP949

KSC5601은 완성형과 조합형의 모든 한글 문자의 표현이 가능한 한글 문자 부호 표준이며 euc-kr과 CP949는 모두 이 KSC5601을 기본으로 한 문자 부호입니다. 유닉스계열의 한글 문자 부호인 euc-kr에서는 KSC5601을 그대로 수용하고 있으며,

윈도우계열 한글 문자 부호인 CP949(MS949)는 완성형 한글의 형태를 취하고 있으나 KSC5601에 의해 조합형으로 만들어지는 한글의 코드까지도 제공하고 있으므로 두 문자 부호의 인코딩 방식은 달라도 같은 코드를 만들어 내게 되어 두 문자 부호는 서로 호환됩니다.

단, java환경에서는 euc-kr이 KSC5601-87로 사용되어 CP949의 확장 완성형과 호환되지 않을 수도 있으니 주의해야 합니다.

 

KSC5601 vs Unicode

유니코드에는 KSC5601의 문자 집합이 포함되어 있지만, 4byte의 유니코드의 어느 범주에 속하느냐에 따라 그리고 어떤 변환식을 사용하느냐에 따라 부호의 값이 달라지므로 KSC5601을 그대로 사용하는 euc-kr(CP949)와 유니코드는 서로 호환되지 않습니다.

현재의 한글 표준 부호는 완성형과 조합형의 구분이 없습니다, euc-kr로 선언된 웹페이지에서든, MS949를 사용하는 윈도우에서든 똠, 꿿, 휗 휅 같은 문자들이 모두 표시가 되기 때문에 한글을 더 쉽게 사용할 수 있어, 국제표준인 유니코드와 유닉스계열의 euc-kr만 잘 구분하여 사용할 수 있으면 인코딩 때문에 한글이 깨지는 일은 없을 것 입니다.

 

UTF-8 vs UTF-16

UTF-8, UTF-16같은 인코딩 방식은 유니코드표의 숫자 키들을 어떻게 표현하느냐에 따라 다릅니다. 뒤에 붙는 숫자의 기본 차이는 문자 하나를 표현할 때 사용할 최소 byte를 의미합니다.  

예를 들어 UTF-8은 1바이트로 표현이 충분한 A같은 경우는 0x41로 표현합니다. 반면 UTF-16은 최소로 16비트 즉, 2바이트로 표현하기 때문에, 0x0041로 표현합니다. 

따라서 UTF-8의 표현 방식이 대체로 더욱 효율적입니다. 세계적으로도 UTF-8표준으로 많이 쓰이는 추세이기도 합니다. 

 

 

 

참조

https://medium.com/@jeongdowon/unicode%EC%99%80-utf-8-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-b6aa3f7edf96

https://studyforus.tistory.com/167

https://meetup.toast.com/posts/35

https://nuli.navercorp.com/community/article/1079940

 



'기술' 카테고리의 다른 글

Spring Boot의 Java 버전 변경하기 (maven, Intellij)  (0) 2024.05.08
Maven을 이용한 웹 어플리케이션 생성 및 설정  (0) 2022.07.23
Maven이란?  (0) 2021.01.08
RHEL7의 malloc  (0) 2021.01.03