4장. 왜 하필 7비트였나 — ASCII의 탄생

만화로 보는 요약 — 먼저 읽어보세요
ASCII는 7비트 128칸을 모두가 공유하는 표준으로 정리해 문자 처리의 질서를 만들었지만, 영어 밖의 문자를 담지 못해 남은 8번째 비트가 새 혼선의 출발점이 됐다.
면접 실전 질문: ① ASCII가 7비트를 택한 이유는? ② ASCII 배치가 영리한 예는? ③ 8번째 비트가 남긴 문제는 무엇인가?
배경 — 표준이 없으면 대화가 안 된다
3장은 “그냥 비트를 더 쓰면 방이 넓어진다”는 답을 남겼죠. 6비트면 64가지, 7비트면 128가지. 그런데 여기서 3장이 슬쩍 넘어간 게 있어요. 몇 비트로 늘릴지, 그리고 그 칸에 뭘 어떤 순서로 넣을지를 누가 정하느냐는 문제입니다.
1960년대 초, 이건 실제로 아수라장이었어요. 회사마다, 기계마다 자기만의 코드를 썼거든요. IBM은 IBM대로, 텔레타이프 회사는 그들대로. A 회사 기계가 보낸 글자를 B 회사 기계가 엉뚱하게 읽는 일이 벌어졌습니다. 눈치채셨나요? 이건 1장에서 본 “같은 신호, 다른 약속표” 그대로예요. 봉화 시대에 예약돼 있던 사고가 컴퓨터에서 되살아난 겁니다.
해결책은 하나뿐이었어요. 모두가 따를 표준 약속표 하나를 정하는 것. 그 표준이 바로 ASCII(American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)입니다.
스토리 — 미국이 정한 128칸
1963년, 미국표준협회(ASA)가 ASCII를 내놓습니다(우리가 아는 형태는 1967년 개정판이에요). 핵심 결정은 7비트였어요. 왜 하필 7이었을까요?
- 6비트(64칸)는 모자랐어요. 영문 대문자 26 + 소문자 26만 벌써 52. 여기에 숫자 10, 문장부호, 그리고 기계를 제어하는 신호까지 넣으면 64칸으론 어림도 없었죠.
- 8비트는 당시엔 과했어요. 128칸이면 필요한 글자가 다 들어갔고, 비트가 적을수록 저장·전송이 쌌으니까요. 게다가 그 시절 통신에선 8번째 비트를 오류 검사(parity) 용으로 쓰는 관행도 있었어요. 전선으로 보내다 비트 하나가 튀는 걸 잡아내려고요. 그래서 실제 글자에 쓸 수 있는 건 7비트, 딱 128칸이었습니다.
이 128칸을 어떻게 채웠는지가 재밌어요. 크게 세 구역입니다.
- 0~31번: 제어 문자. 눈에 보이는 글자가 아니라 명령이에요. 줄바꿈(LF), 탭(TAB), 백스페이스(BS), 경고음(BEL) 같은 것들. 화면에 찍히지 않고 기계를 조종합니다.
- 32번: 공백, 그리고 33~126번: 출력 가능한 글자. 숫자
0~9, 영문 대문자A~Z, 소문자a~z, 각종 문장부호가 여기 있어요. - 127번: DEL. 종이테이프 시절, 잘못 뚫은 글자를 지우려면 모든 구멍을 다 뚫어
버렸는데(7비트가 전부 1,
1111111= 127), 그 “다 뚫음”이 바로 삭제 신호였습니다.
핵심 — 배치의 영리함, 그리고 미국이라는 한계
ASCII가 대단한 건 단순히 “표준을 정했다”가 아니에요. 번호를 매긴 방식이 영리했습니다.
- 숫자를 순서대로 붙여놨다.
'0'은 48번,'1'은 49번…'9'는 57번. 연속이에요. 그래서 문자'7'의 코드값에서'0'의 코드값(48)을 빼면 정확히 숫자 7이 나옵니다. 글자와 숫자 사이에 다리가 놓인 거죠. - 대문자와 소문자를 딱 한 비트 차이로 뒀다.
'A'는 65,'a'는 97. 차이가 정확히 32, 이진수로 보면 비트 하나(0100000)예요. 그래서 대소문자 변환이 비트 하나 뒤집기로 끝납니다. 게다가 알파벳을A→Z순서대로 연속으로 넣어서, 글자 정렬이 그냥 숫자 크기 비교가 됐어요.
print(ord('7') - ord('0')) # 7 — 문자 → 숫자값
print(chr(ord('A') ^ 0b0100000)) # a — ^(XOR)로 그 비트만 뒤집으니 소문자
print('A' < 'B' < 'C') # True — 정렬이 곧 코드값 비교오늘 우리가 아무렇지 않게 쓰는 toUpperCase(), 문자열 정렬, '9' - '0' 같은 트릭이
전부 이 60년 전 번호표 설계에서 나온 겁니다. 우연이 아니라 의도된 배치예요.
그런데 여기, 이 책 전체를 관통하는 근본 한계가 숨어 있습니다.
ASCII의 A는 American이에요. 128칸은 영어에 딱 맞게 설계됐습니다. 그러다 보니 프랑스어의
é, 스페인어의 ñ, 독일어의 ü 같은 글자조차 들어갈 자리가 없어요. 한글이나 한자,
아랍 문자는 말할 것도 없고요. 세상 문자가 이렇게 많은데, ASCII는 영어 알파벳 한 벌로
방을 꽉 채워버린 겁니다.
그리고 더 큰 불씨. 아까 오류 검사용으로 남겨둔 8번째 비트 기억나세요? 통신이 안정되면서
이 비트가 점점 놀기 시작합니다. 8비트를 다 쓰면 128~255번, 칸이 정확히 두 배로
늘어나요. ASCII가 안 쓰고 비워둔 이 128칸 — 여기에 뭘 넣을지는 아무도 안 정했습니다.
정리
- 회사·기계마다 코드가 제각각이라(1장 “다른 약속표”의 재현) 공통 표준이 필요했고, 그게 ASCII(미국표준협회, 1963/1967)다.
- 7비트 = 128칸을 택한 이유: 6비트(64칸)는 대소문자+숫자+기호+제어에 모자랐고, 8번째 비트는 오류 검사(parity) 로 남겨뒀다.
- 배치가 영리하다: 숫자 연속 배치(
'7'-'0'=7), 대소문자 한 비트 차이(변환=비트 뒤집기), 알파벳 순서 배치(정렬=코드값 비교). → 오늘날 문자 처리의 뿌리. - 근본 한계: ASCII는 영어 전용(
é·한글·한자 자리 없음)이고, 8번째 비트(128~255칸)는 통째로 비어 있다.
생각해볼 질문: 128칸이 텅 비어 있고, 아무도 거기 뭘 넣을지 안 정했어요. 그럼 어떻게
될까요? 프랑스는 거기에 é를, 러시아는 키릴 문자를, 각자 자기 나라 글자를 채워 넣기
시작합니다. 문제는 — 다들 같은 128~255번에, 서로 다른 글자를 넣었다는 거예요.
1장의 저주가, 이번엔 진짜 전 지구적 규모로 돌아옵니다.