지난번 포스트에서 우리는 디지털 문자의 시초인 아스키(ASCII) 코드에 대해 알아보았습니다. 아스키는 훌륭했지만, 128개라는 공간은 전 세계의 언어를 담기엔 턱없이 부족했습니다.

오늘은 아스키의 한계를 넘어, 한글, 한자, 아랍어, 그리고 이모지까지 세상의 모든 문자를 통합한 거대한 약속, 유니코드(Unicode) 에 대해 이야기해 보겠습니다.


과거 인터넷 초창기, 다른 국가의 웹사이트에 접속하면 글자가 꺠져서 같은 기호로 뒤덮인 화면을 보는 일이 흔했습니다. 이를 '모지바케(Mojibake)' 현상이라고 부릅니다.

이유는 단순했습니다. 각 나라, 각 언어권마다 서로 다른 문자표(Encoding) 를 사용했기 때문입니다. 같은 2진수 데이터를 두고도 어떤 컴퓨터는 "이건 한글이야"라고 해석하고, 다른 컴퓨터는 "이건 서유럽 언어야"라고 해석하는 식이었죠.

이 디지털 바벨탑의 혼란을 잠재우기 위해 등장한 구세주가 바로 유니코드(Unicode) 입니다.

Surrounding the globe, various characters from different languages

1. 유니코드란 무엇인가?



유니코드(Unicode)는 "Universal Code" 의 줄임말로, 전 세계의 모든 문자에 대해 고유한 번호(Code Point) 를 부여한 국제 표준입니다.

아스키 코드가 0번부터 127번까지 번호를 매겼다면, 유니코드는 그 범위를 사실상 무한대로 확장했습니다. 현재 유니코드에는 14만 자 이상의 문자가 등록되어 있으며, 여기에는 현존하는 언어뿐만 아니라 고대 상형문자, 악보 기호, 그리고 우리가 매일 쓰는 이모지(Emoji)까지 포함됩니다.

코드 포인트 (Code Point)

유니코드는 각 문자에 U+로 시작하는 16진수 번호를 붙여 관리합니다.

  • 라틴 문자 'A': $U+0041$ (아스키 코드와 동일)

  • 한글 '가': $U+AC00$

  • 한자 '日': $U+65E5$

  • 이모지 '😀': $U+1F600$

이제 전 세계 모든 컴퓨터는 $U+1F600$이라는 신호를 받으면, 언어 설정과 관계없이 똑같이 웃는 얼굴(😀)을 떠올릴 수 있게 되었습니다.

2. 유니코드와 UTF-8은 같은 것인가?

많은 분들이 헷갈려 하는 부분입니다. "유니코드" 와 흔히 보는 "UTF-8" 은 다릅니다. 이 둘의 관계를 이해하는 것이 오늘 글의 핵심입니다.

  • 유니코드: 문자와 숫자를 연결해 놓은 '지도(Map)' 입니다. (추상적인 약속)

  • UTF-8 (Encoding): 그 숫자를 컴퓨터 메모리에 실제로 저장하는 '포장 방식(Method)' 입니다.

만약 유니코드가 전 세계 모든 물건에 ID 번호를 붙인 '카탈로그'라면, UTF-8은 그 물건을 트럭에 싣기 위해 상자에 포장하는 '기술'입니다.

3. 왜 UTF-8이 표준이 되었을까?



유니코드의 문자를 컴퓨터에 저장하는 방식(인코딩)은 UTF-16, UTF-32 등 여러 가지가 있습니다. 하지만 현재 웹(Web) 세상의 98% 이상은 UTF-8을 사용합니다.

UTF-8이 승리한 이유는 '가변 길이(Variable Width)' 라는 천재적인 효율성 때문입니다. 글자의 종류에 따라 저장 공간(Byte)을 다르게 배정합니다.

문자 종류 예시 유니코드 번호 UTF-8 저장 크기 특징
기본 라틴어 A $U+0041$ 1 Byte 아스키 코드와 100% 호환
중동/유럽어 Ω, ¶ $U+03A9$ 2 Bytes 라틴 확장, 그리스어 등
CJK (한중일) 한, 中, あ $U+D55C$ 3 Bytes 대부분의 아시아권 문자
이모지/고대어 🚀 $U+1F680$ 4 Bytes 평면을 넘어선 문자들

UTF-8의 장점

  1. 아스키 호환성: 영문 문서를 저장할 때는 아스키 코드와 용량이 똑같습니다. 기존 시스템과 완벽하게 호환됩니다.

  2. 효율성: 자주 쓰는 영문/숫자는 1바이트로 짧게, 복잡한 문자는 길게 저장하여 전체 용량을 최적화합니다.

4. 개발자가 유니코드를 대할 때 주의할 점

문자가 1바이트(아스키)로만 이루어졌던 시절과 달리, 유니코드 환경에서는 "문자열의 길이" 를 계산할 때 주의가 필요합니다.

  • 메모리 관점(Byte): 'A'는 1, '한'은 3입니다.

  • 문자 관점(Character): 'A'도 1글자, '한'도 1글자입니다.

과거의 방식으로 문자열을 자르거나 저장하다가는, 멀티바이트 문자(한글, 한자 등)의 중간이 잘려나가 데이터가 깨지는 사고가 발생할 수 있습니다. 따라서 현대 프로그래밍 언어들은 이러한 유니코드 처리를 자동으로 지원하는 라이브러리를 기본적으로 내장하고 있습니다.


요약

  1. 유니코드: 전 세계 모든 문자에 고유 번호(Code Point)를 부여한 국제 표준 규약.

  2. 목적: 언어권마다 달랐던 인코딩 방식을 통합하여 문자 깨짐(모지바케) 현상 해결.

  3. UTF-8: 유니코드를 가장 효율적으로 저장하는 방식. 영문은 1바이트, 한/중/일 문자는 3바이트로 가변 저장함.

유니코드는 단순한 기술 표준을 넘어, 언어 장벽 없이 전 세계가 정보를 교환할 수 있게 만든 디지털 시대의 가장 포용적인 인프라입니다.


🚀 다음 글 예고

우리가 텍스트를 저장하는 방법(인코딩)을 알았으니, 이제 데이터를 더 똑똑하게 다루는 법을 알아볼 차례입니다. "이미지는 어떻게 0과 1로 저장될까?" 픽셀과 해상도, 그리고 RGB 색상의 원리에 대해 아주 쉽게 풀어보겠습니다.

👇 함께 읽으면 좋은 글


유익하게 읽으셨다면, 다른 IT 기술 이야기도 놓치지 않도록 구독 부탁드립니다!