Skip to Content

{/* 삽화 자리 — 웹툰식 요약 1컷 (hero, 16:9, 현대 톤 · DEVELOPER, 닫는 글) 프롬프트: 여는 글에서 ???로 깨져 있던 그 이력서가, 이번엔 멀쩡한 글자로 또렷이 복원돼 화면에 떠 있다. 개발자가 이제는 당황이 아니라 차분한 표정으로, 화면 아래 흐르는 바이트 (봉화→모스→ASCII→유니코드→UTF-8로 이어지는 긴 흐름)를 이해한 눈으로 바라본다. 막막함이 확신으로 바뀐 수미상관. 복원된 글자·이해의 흐름=toss blue. [STYLE PREFIX] + 현대 ERA + THE DEVELOPER + —ar 16:9 —style raw —no … → public/images/books/encoding/99/webtoon.png */}

닫는 글 · 다시, 글자 앞에서

여는 글에서 우리는 ???로 깨진 이력서 앞에 서 있었어요. 이름도 경력도 전부 외계어로 변한 그 파일 앞에서 막막했죠. “분명 잘 썼는데, 대체 그 사이에서 무슨 일이 벌어진 걸까?”

이제 그 질문에 답할 수 있습니다. 누군가 한쪽 약속표로 저장한 글자를, 다른 약속표로 읽은 거예요. 신호는 멀쩡히 도착했는데 뜻이 어긋난 것. 봉화 셋이 “전면전”에서 “축제”로 뒤집히던 1장의 그 일이, 파일 하나에서 똑같이 벌어졌을 뿐입니다.

돌아보면 이 책은 처음부터 끝까지 딱 한 문장을 여러 시대의 언어로 반복했어요.

인코딩은 기호에 뜻을 미리 약속한 표다. 보내는 쪽과 받는 쪽이 같은 표를 써야 통하고, 다르면 깨진다.

봉화의 불 개수, 모스의 점과 선, 보도의 5비트, ASCII의 128칸, EUC-KR의 2,350자, Shift-JIS의 겹치는 두 번째 바이트, 유니코드의 코드포인트, UTF-8의 가변 바이트 — 이름도 시대도 다 달랐지만, 전부 “이 기호는 이 뜻”이라는 약속표 하나였습니다. 인류는 글자를 멀리, 정확히 나르려고 수천 년째 이 표를 고쳐 써온 거예요. 컴퓨터는 그 표를 01로 옮겨 적었을 뿐이고요.

그 긴 여정에서 우리는 같은 교훈이 모습만 바꿔 되돌아오는 걸 봤습니다. 가변 길이의 경계 문제는 모스에서 처음 나와 멀티바이트와 UTF-8까지 따라왔고, 하위 호환이라는 지혜는 CP949가 EUC-KR을 끌어안고 UTF-8이 ASCII를 품고 utf8mb4가 utf8을 감싸는 데서 거듭 빛났죠. 그리고 **“바이트에는 인코딩 정보가 없다”**는 5장의 한마디는, 결국 모든 모지바케의 뿌리이자 모든 디버깅의 출발점이었습니다.

이제 여러분은 무심코 지나치던 charset=utf-8 한 줄이 다르게 보일 거예요. String.length가 이모지 앞에서 왜 거짓말하는지, MySQL의 utf8이 왜 진짜 UTF-8이 아닌지, 로그의 밸린이 어느 단계에서 태어났는지. 그 짧은 선언 뒤에서 무엇이 여러분의 글자를 지키고 있는지, 그리고 그게 그렇게 생겼는지 알게 됐으니까요.

물론 이 여정이 끝은 아니에요. 유니코드는 지금도 해마다 새 문자와 이모지를 더하고, 자소 묶음을 제대로 세는 일은 여전히 언어마다 제각각이고, 어딘가에선 오늘도 누군가 latin1 컬럼에 UTF-8을 밀어 넣고 있을 겁니다. 인코딩은 완결된 과거가 아니라 지금도 진행 중인 약속이에요. 다만 이제 여러분은 그 약속이 어긋나는 순간을, 당황 대신 바이트를 열어 차분히 짚어낼 수 있습니다.

깨진 글자는 미스터리가 아니라, 알고 나면 당연한 일입니다. 여는 글에서 드린 그 약속을, 마지막 장에서 지킨 셈이에요.

다음에 화면에서 ???를 만나면, 한숨 대신 이렇게 중얼거려 보세요. “어느 표가 어디서 어긋났을까?” 그 한 문장이면 충분합니다. 이제 여러분은 글자 앞에서, 더는 막막하지 않으니까요.

수천 년을 이어온 이 약속의 이야기를 끝까지 함께해 주셔서 고맙습니다. 그럼, 깨지지 않는 글자와 함께.

처음으로 — 인코딩 책 표지

Last updated on