문자를 다루는 인코딩 규칙에 대한 정리

윤석주·2022년 10월 3일
1

기타-공부

목록 보기
2/2

이번 포스팅에선 문자열을 표시하는 코드 체계와 인코딩에 관련된 내용을 살펴보겠습니다.

간단정리

  • 문자열 코드 체계 - ASCII, Unicode
  • 인코딩 방식 - UTF-8 등

ASCII

7bit의 코드체계로 쉽게 말하면 어떤 숫자 하나를 어떤 문자 하나로 매핑하는 것입니다.
ASCII Table을 보고 확인이 가능하며 흔히 C언어에서 많이 테스트 해보죠.

  • 65 -> 'A'
  • %c, 65 -> 'A'
  • %d, 'A' -> 65
    등의 예시로 확인이 가능합니다.

ASCII는 서양권의 표현에 맞춰 2^7 코드체계로 만든 표준 코드 체계입니다. 하지만 지구상의 모든 인간이 컴퓨터를 쓰면서 문제가 발생하기 시작합니다.

Unicode

영문은 ASCII로 해결이 가능합니다. 다른 나라 언어라도 같은 라틴계열까지는 어느정도의 커버가 가능합니다. 하지만 동아시아권으로 넘어오면 상황이 달라집니다. 흔히 얘기하는 한자어 문화권이죠.

여담으로 우리나라에서도 한글 표기의 필요성이 생겼습니다. 한글만의 코드체계가 필요해진 것이죠. 여기서 조합형, 완성형의 2가지 코드체계가 생깁니다. 간단한 예시는 다음과 같습니다.

  • 조합형: 널 => ㄴ, ㅓ, ㄹ (3개의 자/모)
  • 완성형: 널 => B110 처럼 모든 글자를 매핑

한글 입력 방식에 완성형이 가능한지 여부를 놓고 싸움이 났던 역사가 있습니다. 최종적으로 완성형으로 결론이 났죠. 나무위키에 이와 관련된 내용이 정리되어 있으니 찾아보면 될 것 같습니다.

다시 돌아와서 한글 글자를 전부 숫자로 표현해야 합니다. 자음+모음으로 만들 수 있는 모든 글자를 표시해야하죠.. 과연 몇 개나 있을까요?

영문은 ASCII처럼 7bit면 끝납니다. 하지만 한글은 절대 불가능합니다.

일본과 중국은 어떨까요? 중국의 한자는 대략적으로 10만개 이상이라고 알려져 있습니다. 즉, 정확히 모든 글자를 표현하려면 10만보다 경우의수가 커야 합니다. 그러나 16bit도 65536에 불과하죠. 여기서 상용한자만 추려서 16bit 코드체계를 사용하기로 합의합니다.

이렇게 모든 나라의 언어를 표현하는 16bit 코드체계가 탄생하게 되고 이것이 바로 Unicode입니다.

  • ASCII -> 7bit로 영어를 커버하는 코드체계
  • Unicode -> 16bit로 전세계 언어를 커버하는 코드체계

unicode.org 에서 확인이 가능하며 32bit 체계도 존재합니다.

"Everyone in the world should be able to use their own language on phones and computers"

C언어의 wchar(wide character)같은 자료형은 컴파일러의 설정에 따라 16bit, 32bit 등으로 표현됩니다.

인코딩 이슈 등장

80년대에 MS가 급부상 하면서 Unicode와 비슷한 의미인 Multi Byte Character String을 사용합니다. 그리고 여기서 한글 처리를 위해 CP949(cp=codepage)를 정의합니다. EUC-KR인코딩도 여기서 등장했죠.

MS와 더불어 인터넷도 많이 발달하기 시작합니다. 그러면서 문자 인코딩과 관련된 이슈가 발생하기 시작했습니다.

HTML은 기본적으로 문서이고 문자 정보가 잔뜩 들어있습니다. 또 브라우저를 이용해 보게 되어있죠. 즉, 브라우저가 문자를 어떻게 해석하느냐에 따라 화면이 보이기도 하고 깨지기도 하는 것입니다.

또 문자정보는 데이터베이스에도 많이 저장되죠. 따라서 문자열을 해석하는 인코딩 방식에 대한 대동단결이 필요합니다. 그러면서 등장한 것이 바로 UTF-8이죠.

UTF-8에선 한글을 3byte로 변환합니다.

UTF체계도 하나가 아니라 다양하게 있지만 웹에선 8으로 단결하고 있는 상황입니다.

UTF-8은 Unicode를 한대 표현이 가능합니다. 한글은 3byte로 표현되죠.

모든 체계가 UTF-8이 아니기 때문에 인코딩 방식을 알리기 위한 UTF-8 BOM(Byte Order Mark)가 등장하게 됩니다.

UTF-16도 있습니다. bit/small endian (LE-> little, BE -> big) 방식이 존재하죠.

영어던 한글이던 모든 글자는 16bit로 표현됩니다. ASCII방식 표현법도 강제로 늘어나게 되죠.
예를 들어
31 -> 0031이 되면 big endian
31 -> 3100이 되면 small endian
입니다. (자세한건 찾아봅시다.. ㅠ_ㅠ)

웹기술은 UTF-8으로 대동단결을 하고 있는 상황이며 16진수로 표현합니다. URL Encoding의 경우 앞에 %를 넣어서 표현해주죠.

'널' 같은 경우 EB 84 90 으로 표시됩니다. 즉 널을 URL Encoding하게 되면
널 -> EB 84 90 -> %EB%84%90이 되는 것이죠. url에 %가 붙은 저런 표기법을 많이 본 경험이 있을 겁니다.

Base64 encoding도 알아야 하는데.. 이건 다음 포스팅에서 정리하도록 하겠습니다.

간단 정리

언어를 표기하기 위한 코드 체계

  • ASCII - 영문권 언어 코드 체계
  • Unicode - 전세계 언어 코드 체계

이런 코드체계는 사람과 컴퓨터의 언어가 통신할 준비가 되었음을 의미합니다.

사람의 언어 <-> 컴퓨터 언어

를 서로 변경해주는 과정이 필요하고 이런것을 "인코딩" 이라고 합니다.
UTF는 유니코드 문자를 인코딩하는 방식을 나타냅니다.

  • UTF-8 - 8bit를 사용하여 1개의 Index를 표현
  • 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나이다.
  • 일반적인 문자는 3byte 내로 처리
  • 4byte 영역에는 이모티콘 같은 문자가 존재한다.

나무위키를 확인하면 인코딩 방식을 잘 살펴볼 수 있다.

출처

profile
웹 개발을 공부하고 있는 윤석주입니다.

0개의 댓글