한글은 왜 깨질까?
비밀 쪽지로 배우는
UTF-8과 문자 인코딩
(고등학교 정보)
오래된 게임이나 외국 프로그램에서 한글이 □□□나 ????로 깨진 거, 한 번쯤 봤죠. 사실 컴퓨터가 글자를 다루는 방식만 알면 전부 이해되는 이야기예요. 170여 년 전, 신문에 숨겨졌던 비밀 연애편지에서 시작해 볼게요.
신문에 숨긴 비밀 연애편지
휴대폰도 메신저도 없던 1853년 영국. 서로 사랑하는 두 사람이 있었어요. 그런데 당시 많은 연인들이 그랬듯, 둘도 마음 편히 편지를 주고받을 수 없었죠. 편지를 보내면 부모님이 가로채 읽어버리기 일쑤였거든요.
그래서 둘은 기발한 방법을 떠올립니다. 온 나라가 보는 신문에, 대신 둘만 아는 암호로 사랑의 메시지를 싣기로 한 거예요. 영국에서 제일 유명한 신문 《타임스》 1면 한 귀퉁이, ‘Kensington(켄싱턴)’이라는 제목 아래로요. 남들 눈엔 그냥 알 수 없는 숫자 나열이지만, 두 사람은 약속표만 있으면 척척 읽었죠. 말하자면 모두가 보는 곳에 올리는 비밀 DM이었던 셈이에요.
13·5·5·20 — 13·5 — 1·20 — 14·9·14·5
그런데 여기서 일이 틀어집니다. 당시엔 신문 암호 풀기를 취미로 즐기던 사람들이 있었거든요. 그중 두 명, 과학자 찰스 휘트스톤과 라이언 플레이페어가 이 켄싱턴 암호를 가볍게 풀어버려요. 그리고 짓궂게도, 연인인 척 가짜 답장을 똑같은 암호로 신문에 띄웠습니다.
그 순간 두 사람은 등골이 서늘했겠죠. ‘누군가… 우리 편지를 다 읽고 있어!’ 깜짝 놀란 연인은 황급히 신문 연락을 끊습니다. 그리고 곧, 들키지 않을 새 암호를 다시 만들 궁리를 시작했죠.
실제로 있었던 일이에요. 출처: 맥길대학교 도서관 ‘Ciphers of the Times’ 연구(기록 보기).
수업 시간의 비밀 쪽지
방금 그 연인들이 한 일을, 우리 교실 버전으로 아주 간단하게 만들어 볼게요. 민지는 뒷자리 서연이에게 쪽지를 보내고 싶어요. 그런데 선생님이 보면 큰일이죠. 그래서 둘은 둘만의 약속표를 만듭니다. 글자 하나하나에 숫자를 정해두는 거예요.
우리만의 약속표 🤫
ㅏ→11 ㅑ→12 ㅓ→13 ㅕ→14
ㅇ→17 ㅎ→20 …
↑ 쪽지엔 숫자만! 표가 있어야 읽을 수 있어요
이제 쪽지에는 글자 대신 숫자만 적어요. 받은 사람은 약속표를 보고 숫자를 다시 글자로 바꿔 읽죠. 둘 다 같은 표를 가지고 있으니 척척 통합니다.
다른 표를 쓰면 글이 깨진다
그런데 옆 반 친구가 그 쪽지를 주웠어요. 이 친구도 자기만의 약속표가 있는데, 모양이 전혀 달라요. 같은 숫자 17이 민지 표에선 ㅇ이지만, 옆 반 표에선 ㅋ일 수도 있죠.
그러니 같은 쪽지를 읽어도 전혀 엉뚱한 글자가 나옵니다. 누가 봐도 알아볼 수 없는 암호가 되어버리는 거예요. 숫자는 똑같은데 말이죠.
놀랍게도, 컴퓨터가 하는 일
여기서 반전. 방금 그 쪽지 이야기가 바로 컴퓨터가 글자를 다루는 방식이에요. 컴퓨터는 사실 글자를 전혀 몰라요. 아는 거라곤 0과 1, 딱 두 가지뿐이죠. 맞아요, 지난 시간 ‘이진법 실습’에서 다룬 바로 그 이진법이에요. 컴퓨터 속 모든 것은 결국 0과 1, 즉 이진법으로 적혀 있어요.
그럼 글자는요? 컴퓨터는 먼저 「어떤 글자 = 몇 번」이라고 약속해요. 이 약속표를 문자 인코딩(encoding)이라고 부르고, 알파벳을 위한 가장 기본적인 표가 아스키(ASCII) 코드예요. 여기선 A는 65번, B는 66번이죠.
그런데 잠깐, 컴퓨터는 0과 1만 안다면서 웬 65일까요? 여기서 지난 시간 실력이 빛을 발해요. 65는 십진법 수죠. 배운 대로 이진법으로 바꾸면 1000001이 나와요. 그런데 컴퓨터는 글자 하나를 0과 1 여덟 칸(이걸 1바이트라고 해요)에 맞춰 저장하기 때문에, 앞을 0으로 채워 01000001로 적죠. 이 0과 1 줄이 바로 컴퓨터 속 ‘A’예요. 정리하면 글자 → 번호(십진법) → 이진법(0과 1)으로 이어집니다.
민지와 서연이가 쪽지를 주고받던 것처럼, 컴퓨터도 글자를 번호로 바꾸고 그 번호를 0과 1로 저장해요. 읽을 땐 거꾸로, 0과 1을 번호로 풀고 번호를 다시 글자로 바꾸죠.
그래서 진짜 문제가 터졌다
문제는 이 약속표를 나라마다 따로 만들었다는 거예요. 영어는 알파벳과 기호를 다 합쳐도 글자가 100개 안팎이라, 128칸짜리 작은 표 하나(아스키)로 충분했어요.
그런데 한글은 표현할 수 있는 글자가 1만 자가 넘고, 한자와 일본어도 수천에서 수만 자예요. 작은 표로는 어림없죠. 그래서 한국은 한국대로, 일본은 일본대로 자기들만의 큰 약속표를 따로따로 만들었어요.
결과는 뻔하죠. 한국 컴퓨터가 한국 표로 저장한 글을, 다른 표를 쓰는 컴퓨터가 열면? 옆 반 친구처럼 글자가 와장창 깨집니다. 우리가 본 □□□와 ????의 정체가 바로 이거예요.
해결사, UTF-8의 등장
이쯤 되면 답은 뻔하죠. "전 세계가 똑같은 표 하나만 쓰면 되잖아!" 그래서 만든 게 유니코드(Unicode)예요. 지구상 거의 모든 문자에 고유한 번호를 매겨둔 거대한 약속표죠. 한글도, 알파벳도, 한자도, 아랍 문자도, 심지어 이모지 😀까지 전부 한 표 안에 들어 있어요.
그리고 이 번호들을 컴퓨터에 똑똑하고 효율적으로 저장하는 방식이 바로 UTF-8입니다. 똑똑하다는 건 이런 뜻이에요 — 자주 쓰는 영어·숫자·기호는 옛 아스키 그대로 1바이트만 쓰고, 한글은 3바이트, 이모지는 4바이트처럼 딱 필요한 만큼만 늘려 씁니다. 덕분에 예전 영어 문서나 코드는 한 글자도 안 건드려도 그대로 통하면서, 전 세계 문자까지 한 표에 담을 수 있죠. 이제는 어느 나라, 어느 컴퓨터에서 열어도 글자가 깨지지 않아요. 모두가 같은 표를 쓰니까요.
글자, 직접 깨뜨려 보기
백문이 불여일견, 직접 확인해 볼까요? 글자를 입력하면 컴퓨터가 그 글자를 UTF-8 표대로 어떤 숫자로 저장하는지 보여줘요. 그리고 똑같은 숫자를 엉뚱한 표(서유럽 코드)로 읽으면 어떻게 되는지도요. 한글, 영어, 이모지를 번갈아 넣어 보세요. 가령 안녕하세요를 넣으면, 한글이 어떻게 깨지는지 바로 눈으로 확인할 수 있어요.
저장된 숫자는 양쪽이 완전히 똑같아요. 읽는 표만 다른데 글자가 깨집니다.
※ 숫자는 이해하기 쉽게 10진수로 표시했어요. ‘셋’에서 봤듯 컴퓨터 속에선 이 숫자들도 결국 0과 1로 저장되죠. 그리고 ‘다섯’에서 본 가변 길이 — 영어 1·한글 3·이모지 4바이트 — 가 각 글자 아래 숫자 개수로 그대로 나타나는 것도 확인해 보세요.
그래서 코딩할 때 계속 나온다
이제 여러분이 프로그래밍을 배우면 이런 걸 자주 만나게 돼요. 파일을 저장할 때 encoding="utf-8" 같은 말을 적는 거죠.
파일 저장 창에서 인코딩을 고르는 칸, 코드에 적는 utf-8, "꼭 UTF-8로 저장하세요"라는 안내까지 — 전부 "우리 같은 표 쓰자"고 서로 약속을 맞추는 일이에요. 그래야 내가 쓴 글이 다른 컴퓨터에서도 안 깨지니까요.
오늘 이야기, 한 장으로
- 쪽지에 적힌 숫자 = 컴퓨터 속 0과 1
- 둘만의 약속표 = 문자 인코딩(아스키 같은)
- 유니코드 = 글자마다 번호를 매긴 전 세계 사전
- UTF-8 = 그 번호를 실제로 저장하는 방법
- 같은 숫자를 다른 표로 읽기 = 글자 깨짐(□□□)
스스로 확인해 보기
- 저장된 숫자가 똑같은데도 글자가 깨지는 이유는 무엇일까요?
- UTF-8이 예전 영어 문서까지 안 깨뜨리면서도 효율적인 비결은 무엇일까요?
- 코드에
encoding="utf-8"이라고 적는 건 결국 무엇을 약속하는 걸까요?
UTF-8은 전 세계가 함께 쓰기로 약속한,
글자가 안 깨지는 표예요.
이제 코드에서 만나도 당황하지 않겠죠?
댓글
댓글 쓰기