본문 바로가기

3.구현

유니코드(Unicode)란

들어가기

문자열을 다루면서 유니코드(unicode)를 많이 사용하고 있다. 유니코드는 전 세계 문자를 공통으로 표현하는 국제 문자 코드 규약이다. 한번 유니코드에 간단하게 살펴보자.

작성자: ospace114@empal.com, http://ospace.tistory.com/

문자 표현 방식들

실제로는 문자열을 표현하는 방식은 여러 개가 있다. 지금도 사용하고 있어서 어느정도 알아두는게 도움이 된다.

  • 확장 ASCII
    • 기존 ASCII에서 영어 표현 한계로 특수 문자를 확장한 ISO/IEC 8859-1을 정의했다.
    • 지금 사용하는 ASCII 인코딩이 확장 ASCII이다.
    • 8 bit 크기로 0x00~0xFF 범위를 가진다.
  • MBCS(Multi-byte Character set)
    • 여러 byte를 사용해서 한 문자를 표현한다
    • 보통 1byte 또는 2byte(0x80 이상)를 사용한다
    • 동시에 다른 언어들을 표현하는데 제약이 있다.
    • 사용하는 인코딩 종류로 EUC-KR, EUC-JP, BIG5, GB2312가 있다
  • 유니코드(Unicode)
    • 전세계 문자를 한 문자당 고정된 크기 데이터로 표현한다
    • 16비트 크기 BMP(Basic Multilingual Plane)에 현재 사용 중인 모든 문자를 포함한다
    • 32비트 크기 Supplementary Plane에 확장 언어나 고어 및 새로운 언어를 포함한다
    • 인코딩 종류로는 UTF-8, UTF-16, UTF-32, UCS-2, UCS-4 등이 있다

이외에도 다양한 방식이 있다. 한글도 이미 완성형, 조합형 형태로 한글 코드 표준을 정의했다. 현재 시점에서 웹 환경의 거의 대부분은 유니코드가 사용된다. 이외 다른 곳에서도 유니코드가 많이 사용되고 있다.

유니코드

유니코드는 전 세계 문자를 표현할 수 있게 설계된 표준 국제 문자 코드 규약이다. 유니코드 이전에는 다른나라 언어를 같이 표현하는데 문제가 많았지만, 유니코드를 사용하면서 문제가 대부분 사라졌다. 현재 표현할 수 있는 범위 중에 미사용된 범위도 매우 많아서 앞으로 새로 추가될 언어에 대해서는 당분간 걱정은 없다.
대부분의 문자는 BMP 플랜에 포함되어 있고 일부 확장된 부분이 Supplementary 플랜에 포함되고 있다. BMP이 대부분 문제체계가 포함되고 있어서 이 범위를 표현하기 위한 코드 크기는 16비트가 된다. Supplementary 플랫를 표현하기 위한 코드 크기는 32비트까지 늘어난다. 그래서 웹에서 유니코드 표현하는 문자열 표현을 보면 2 byte 16진수 표기가 일반적인 표현이 된다.

UTF-8

UTF-8(Unicode Transformation Format - 8)은 거의 대부분 유니코드를 표현하는 인코딩 포멧이다. 유니코드를 표현을 위한 가변길이 문자 인코딩 방식으로 1

4 byte 가변길이를 가지는 방식이다. UTF-8의 장점은 기존 char형(1 byte) 호환되어 ASCII 표현도 같이 포함되고 있기 때문이다. BMP가 UTF-8로 인코딩 된 경우 1

3 bytes 크기를 가지며 Supplementary인 경우는 4~6 byte 크기를 갖는다.

Bits 1 byte 2 byte 3 byte 4 byte 5 byte 6 byte
7 0#######
11 110##### 10######
16 1110#### 10###### 10######
21 11110### 10###### 10###### 10######
26 111110## 10###### 10###### 10###### 10######
31 1111110# 10###### 10###### 10###### 10###### 10######

위에서 # 부분이 유니코드 이진 값이 포함된다. 문자 표현에서 첫번째 비트는 항상 0으로 시작한다. 앞에 1로 시작하는 경우는 사용할 바이트 개수를 의미한다. 뒤에오는 바이트의 이진 값은 10으로 시작한다. 첫번 째 바이트에서 1의 개수에 따라서 표현할 수 있는 값 범위가 결정된다.

UTF-8을 사용하는 이유는 기본 ASCII을 그대로 변형 없이 사용할 수 있다는 장점이다. 이로 인해 기존 2바이트가 필요한대 표현이 1바이트로 줄어드는 압축 효과도 있다. 물론 영어권이 아닌 경우는 3 byte 크기로 늘어 날 수도 있다. 또한 인코딩과 디코딩이 매우 단순하다. 단점으로는 문자 길이를 바로 알 수 없다. 처음부터 끝까지 스캔해야 전체 문자 길이를 알 수 있다. 그렇기에 필요한 부분을 추출하거나 표현하기 위해서는 앞의 모든 문자를 스캔해야 한다.

문자열 표현

UTF-8은 바이너리 형식 데이터이다. 유니코드를 문자열 형태로도 표현할 수 있다. 보통 "U+"로 시작하거나 "0x"로 시작한다. 대부분 전자가 일반적인 표현 방식이고 후자는 16진수 표현할 때 사용하는데 유니코드에서 표현할 때에도 사용할 수 있다. 단지 후자인 경우는 항상 바이트 단위로 16진수 표현하기에 다른 길이를 표현할 때에는 제약이 있다.

U+AC00
0xAC00

마무리

현재 대부분의 문자 표현에 유니코드를 사용하고 있다. 유니코드를 사용하고 있지 않은 프로그램이나 환경에서는 영어말고 다른 언어를 표현할때 깨지는 경우가 많다. 이런 인코딩 방식이 맞지 않을 경우 깨져서 제대로 보이지 않는다. 이런 문제는 윈도우에서 흔히 접할 수 있다. 간혹 테스트 문서에 한글을 저장했는데 다른 데에서 수정하고 작업하다가 어느 순간 깨지는 경우가 많다. 이는 편집 프로그램이 인코딩 방식이 다르게 처리되고, 다른 곳에서 호환 안되는 경우가 많이 발생한다. 필자도 에디터에 인코딩 기능이 있다면 UTF-8로 지정해서 사용한다. 별거 아닌 부분처럼 보이지만 중요한 부분이다.
부족한 글이지만 도움이 되었으면 하네요. 모드 즐거운 코딩하세요^^. ospace.

참고

[1] Joel Spolsky, The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets, http://www.joelonsoftware.com/articles/Unicode.html
[2] 유니코드, https://namu.wiki/w/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C

반응형

'3.구현' 카테고리의 다른 글

자체 문서화 코드  (0) 2024.01.17
멀티코어/멀티프로세스 캐쉬  (0) 2022.05.06