DB

유니코드(UNICODE) 인코딩: UCS-2, UTF-16, UTF-8, UTF-32

alien22c 2024. 2. 21. 16:10
728x90
728x90

기본적으로 컴퓨터는 숫자만 처리할 수 있어 문자와 기타 문자를 각각에 번호를 할당하여 저장한다.

유니코드 표준이 개발되기 전에는 이러한 숫자를 할당하기 위해 문자 인코딩이라는 다양한 시스템이 있었으나,
두 개의 인코딩이 두 개의 서로 다른 문자에 대해 동일한 숫자를 사용하거나 동일한 문자에 대해 서로 다른 숫자를 사용하는 경우가 발생하여 이를 해결하기 위한 "유니코드"가 등장하게 된다.

UNICODE 
UNICODE는 모든 문자를 특정 숫자(unique number)에 1:1 매핑을 제공하여 어떤 환경(플랫폼, 장치, 애플리케이션 또는 언어 등)에서도 같은 언어를 볼 수 있도록 한다.
유니코드를 표현하는 방식(인코딩) 으로 UCS-2, UTF-16, UTF-8, UTF-32 등이 있다.
 
참고) 인코딩, Encoding (문자집합을 표현하는 방식)
유니코드는 코드체계 또는 문자집합을 명명하는 것이며 이를 표현하기 위해서는 UTF-8, UTF-16, UTF-32 등과 같은 인코딩이 필요함. 인코딩(encoding)이란 각 "글자"들을 어떤 방식으로 컴퓨터가 이해하는 "숫자" 바이트로 대응(mapping)시켰는지에 대한 규칙을 의미함.

엔디언(Endianness)
 - 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법
 - 여러 바이트로 이루어진 숫자를 저장할 때 시중의 모든 CPU가 같은 순서로 저장하는 것이 아니며,
   어떤 플랫폼이 바이트를 어떤 순서로 저장하는지 그 방식을 일컬어 플랫폼의 엔디언(Endianness)이라 함.
   엔디언은 크게 리틀 엔디언(Little-endian), 빅 엔디언(Big-endian)으로 나뉨
 - 리틀 엔디언 : 여러 바이트로 구성되는 숫자를 가장 작은 자리의 바이트부터 먼저 저장 
    ex) 인텔의 x86, x64, 애플의 iOS 계열 하드웨어
 - 빅 엔디언 : 반대로 최상위 바이트3를 가장 먼저 저장

UCS-2 (Universal Character Set 2(octets))
 - 유니코드에 매핑된 문자들의 갯수는 초창기에 2바이트를 넘지 않아 고정 2바이트 인코딩인 UCS-2가 탄생함.
 - 하지만 유니코드에 매핑된 문자들의 갯수는 점점 늘어났고, 고정 2바이트로는 모든 유니코드를 표현 할 수 없는 상태가 됨.

UTF-16 (UCS Transformation Format, 16-bit form)
 - UCS-2로 모든 문자를 표시할 수 없는 한계를 극복하기 위해 2바이트 고정 크기가 아닌, 가변크기의 UTF-16이 탄생함. 
 - UTF-16은 UCS-2에 표현되어 있는 글자는 2바이트로 표기하고, 2바이트를 넘어서는 문자는 4바이트로 표기하는 인코딩 방식임. 따라서 UTF-16은 UCS-2의 대안으로 제시 되었던 UCS-4보다는 공간을 효율적으로 사용하면서 UCS-2와 호환됨.
 - 기존 ASCII와 호환되지 않는 단점 존재, 엔디언 호환성 문제가 있어 다른 대안이 필요하게 됨

UTF-32 (UCS Transformation Format, 32-bit form)
 - 유니코드를 무조건 4바이트를 사용하여 표기하는 인코딩 
 - UTF-32는 가변 길이 인코딩에 비해 공간을 너무 많이 차지하기 때문에 잘 쓰이지 않음

UTF-8 (UCS Transformation Format, 8-bit form)
 - UTF-8은 가변 인코딩으로 1바이트 에서 6바이트를 사용
 - UTF-16이 ASCII와 호환되지 않았던 점을 보안하여 UTF-8은 처음 부분에 ASCII코드 값과 똑같은 코드 값을 넣어 아스키 문서를 UTF-8으로 그대로 읽을 수 있음
 - 엔디언 문제를 해결하여 호환성 뛰어남
 - 가장 널리 쓰이는 유니코드 인코딩

728x90
728x90