문자열 인코딩은 실무 개발에서 중요한 개념이지만, 인코딩으로 인한 문제가 생기기 전까지는 배울 기회가 없는 기술 입니다.
아스키 코드, EUC-KR, UTF-8, UTF-16, UTF-32와 같은 단어를 한 번 이상 들어봤어도 이 단어들이 무슨 뜻인지, 문자열 인코딩이 정확이 무엇인지 모르는 경우가 많아 이번 포스트에서 살펴 보도록 하겠습니다.
위와 같이 글자가 깨지거나 보이지 않는 문제가 발생한걸 자주 본적이 있으셨을 겁니다. 호환되지 않은 문자열을 인코딩을 사용하여 문자를 읽었기 때문입니다.
컴퓨터가 처음 등장했을 때 모든 프로그램은 영어와 일부 특수문자만 지원을 했습니다. 그러나 여러 국가에서 컴퓨터를 사용하기 위해 국가별로 사용하는 언어를 표현하고자 독자적인 규칙을 만들기 시작했습니다.
문자열 인코딩
문자열 인코딩이란 2진법을 사용하는 컴퓨터가 인간의 언어를 2진수로 변환하는 방식입니다. '안녕하세요' 와 같은 문장을 그래도 읽거나 처리할 수 없기 때문입니다.
앞서 이야기했던 아스키 코드, EUC-KR, UTF-8, UTF-16, UTF-32가 이러한 규칙에 포함됩니다. 문자열 인코딩 규칙은 종류에 따라 변환 방식이 조금 다르지만 원리는 간단합니다.
아스키 코드(ASCII)
아스키 코드는 처음으로 표준을 정립한 문자열 인코딩 방식으로 아직까지 많이 사용됩니다. 사용할 수 있는 문자의 종류에는 대문자, 소문자, 아라비아 숫자, 공백 및 특수 문자들이 있으며 문자를 표현할 때는 0부터 127까지, 총 128개의 숫자를 사용합니다.
아스키 코드는 영어를 제외한 다른 언어를 표현할 수 없습니다. 그래서 각 나라에서 컴퓨터를 사용하기 시작했을 때는 아스키 코드 대신 독자적인 문자 집합과 인코딩 방식을 만들어 사용했고, 한국도 예외는 아니었습니다.
EUC-KR(CP949)
우리나라에서는 컴퓨터로 한글을 표현하는 방법으로 EUC-KR 문자 집합을 만들었습니다.
한국어 문자 집합으로 문자 하나를 표현하기 위해 2바이트를 사용하고, 아스키 코드 문자를 표현할 때는 1바이트를 사용하기 때문에 아스키 코드와 호환이 됩니다.
가능하다면 UTF-8로 바꾸는게 좋지만 국내에서 만든 서비스들 중에 아직까지 EUC-KR을 사용하는 곳이 많습니다.
유니코드(UTF-8, UTF-16, UTF-32)
1. UTF-8
UTF-8은 8비트(1바이트)로 인코딩 한다는 것을 의미합니다. 아스키 코드와 완벽하게 호환되며, 표현하려는 문자에 따라 최소 1바이트에서 최대 6바이트까지 사용합니다.
2. UTF-16
UTF-16은 16비트(2바이트)로 인코딩하는 것을 의미 합니다. 2바이트 또는 5바이트만 사용하기 때문에 아스키 코드와 호환 되지 않습니다.
- 바이트 순서 표시
UTF-16과 UTF-32는 바이트순서표시(Byte Order Mark)를 사용합니다. BOM은 문자열 가장 맨 앞에 2바이트에 0xFEFF(유니코드로 U+FEFF)로 표기하여 사용한다는 것을 의미합니다. 또한 0xFE와 0xFF중 어떤 문자가 먼저 오는지에 따라 리틀엔디언(Little Endian)과 빅 엔디언(Big Endian)으로 나뉩니다.
BOM을 이용하여 바이트 표현 순서를 정하는 이유는, CPU설계에 따라 바이트 값을 처리하는 순서가 다르기 때문입니다. 같은 0xFEFF를 CPU가 읽을때 리틀엔디언 방식은 0xFE 다음 0xFF을 읽으며, 빅 엔디언 방식은 0xFE 다음 0xFF를 읽습니다.
종류 | 0x1234표현 | 0x12345678표현 |
빅 엔디언 | 12 34 | 12 34 56 78 |
리틀 엔디언 | 34 12 | 78 56 34 12 |
3. UTF-32
4바이트를 고정적으로 사용하고, UTF-32를 사용해야 하는 환경이 아니라면 사용하지 않습니다.
참고 자료
학교에서 알려주지 않는 17가지 실무 개발 기술
https://www.hanbit.co.kr/store/books/look.php?p_code=B9288599157
'컴퓨터 기초 및 개념' 카테고리의 다른 글
해시 함수(Hash Funtion)란? (0) | 2022.12.11 |
---|---|
IT 필수 지식 - 1. IT 큰그림 (1) | 2022.05.15 |
[컴퓨터 기초] Thread, Process, Context Switching (0) | 2019.07.24 |
[컴퓨터 기초] 메모리구조(Memory Structure) (0) | 2019.07.11 |
[컴퓨터 기초] 커널(Kernel)과 쉘(Shell) (0) | 2019.06.25 |