사전 ASCII
포맷

ASCII

gabury1고친 사람 github-actions[bot]

ASCII 는 영어 글자와 숫자, 기호를 컴퓨터가 다루는 수로 바꿔 적는 약속입니다. 글자마다 0부터 127까지 번호를 하나씩 붙여 두고, 그 번호를 바이트 하나에 담습니다. 뒤에 나온 문자 인코딩 대부분이 이 128개 번호를 그대로 물려받았습니다. 그래서 오늘 쓰는 텍스트 파일과 통신 규약 아래에도 이 약속이 깔려 있습니다.

쉽고 빠른 이해

ASCII 는 영어 글자 하나를 0부터 127 사이의 번호 하나로 바꾸는 표입니다. 대문자 A 는 65번, 숫자 글자 0 은 48번입니다.

컴퓨터가 다루는 것은 수뿐입니다. 글자를 주고받으려면 어느 글자를 몇 번으로 적을지 보내는 쪽과 받는 쪽이 미리 맞춰 두어야 합니다. 이 약속이 없으면 같은 바이트를 서로 다른 글자로 읽습니다.

어떻게 도나:

  1. 적을 글자의 번호를 표에서 찾습니다
  2. 그 번호를 바이트 하나에 담습니다. 127 이하라 일곱 비트면 들어갑니다
  3. 읽는 쪽은 바이트 값을 다시 표에서 찾아 글자로 되돌립니다

대가는 담는 글자가 영어와 기호뿐이라는 점입니다. 한글도 악센트가 붙은 유럽 글자도 이 표에 없습니다. 그 글자들을 적으려고 인코딩이 여럿 갈라져 나왔고, 적은 것과 다른 인코딩으로 읽으면 글자가 깨집니다.

상세

이 절은 ASCII 를 128칸짜리 번호표 하나로 따라갑니다. 먼저 이름과 표의 크기를 보고, 그 표 안에 무엇이 들었는지 봅니다.

이어서 번호를 어떤 순서로 배치했는지, 바이트에서 남는 비트 하나가 무엇을 낳았는지, 이 표가 못 담는 것이 무엇인지를 짚습니다.

이름과 표의 크기

ASCII 는 American Standard Code for Information Interchange 의 줄임말입니다. 우리말로 옮기면 미국 정보 교환 표준 부호입니다. 이름 그대로 서로 다른 기계가 글자를 주고받을 때 쓰라고 만든 표입니다.

글자를 수로 바꿔 바이트에 적는 규칙을 문자 인코딩이라고 부릅니다. ASCII 는 그런 규칙 가운데 하나이고, 뒤에 나온 규칙들이 딛고 선 바닥이기도 합니다.

표에는 0번부터 127번까지 모두 128칸이 있습니다. 128은 2를 일곱 번 곱한 수라, 일곱 비트면 모든 번호를 적을 수 있습니다. 그래서 ASCII 를 일곱 비트 부호라고 부릅니다.

비트는 0 이나 1 하나를 담는 가장 작은 단위이고, 여덟 비트가 모이면 바이트 하나가 됩니다. ASCII 글자 하나는 바이트 하나에 담기고 비트가 하나 남습니다. 이 남는 비트는 뒤에서 다시 나옵니다.

표 안에 들어 있는 것

128칸은 두 무리로 나뉩니다. 하나는 화면에 그려지는 모양이 없는 제어 문자이고, 다른 하나는 눈에 보이는 글자입니다. 번호 순서대로 늘어놓으면 이렇습니다.

번호 무엇이 들었나 칸 수
0 ~ 31 제어 문자 32
32 ~ 126 눈에 보이는 글자 95
127 제어 문자 하나 1

제어 문자는 글자가 아니라 받는 쪽에 무엇을 하라고 시키는 번호입니다. 줄을 바꾸라거나, 다음 탭 칸으로 밀라거나, 소리를 내라는 뜻입니다.

옛 통신 장비와 프린터를 다루려고 넣은 번호라 지금은 쓰지 않는 것이 대부분입니다. 아직 쓰는 것은 줄바꿈에 쓰는 LF(line feed) 와 CR(carriage return), 탭 HT(horizontal tab), 그리고 문자열의 끝을 나타내는 NUL(null) 정도입니다.

눈에 보이는 글자는 공백에서 시작합니다. 숫자 열 개, 대문자 스물여섯 개, 소문자 스물여섯 개가 있고, 나머지가 문장 부호와 기호입니다.

번호를 붙인 순서

번호는 아무렇게나 붙인 것이 아닙니다. 같은 무리의 글자를 번호가 이어지도록 놓았습니다.

글자 번호
0 ~ 9 48 ~ 57
A ~ Z 65 ~ 90
a ~ z 97 ~ 122

이 배치 덕분에 프로그램이 글자를 가릴 때 표를 뒤지지 않아도 됩니다. 어떤 번호가 48 이상 57 이하면 그것은 숫자 글자입니다. 그 번호에서 48을 빼면 글자가 나타내는 값이 나옵니다.

대문자와 소문자는 번호가 언제나 32 차이 납니다. 32는 2를 다섯 번 곱한 수라, 두 글자를 비트로 늘어놓으면 여섯 번째 비트 하나만 다릅니다. 대소문자를 바꾸는 일이 비트 하나를 뒤집는 일이 됩니다.

파이썬은 글자와 번호를 오가는 함수를 둘 줍니다. ord() 는 글자를 번호로, chr() 는 번호를 글자로 바꿉니다.

Python
ord("A")              # 65
ord("a")              # 97
ord("a") - ord("A")   # 32
chr(65 + 32)          # 'a'

마지막 줄처럼 대문자의 번호에 32를 더하면 같은 글자의 소문자가 나옵니다. 문자열 라이브러리가 대소문자를 바꿀 때 하는 일이 이것입니다.

남는 비트 하나

바이트는 여덟 비트인데 ASCII 는 일곱 비트만 씁니다. 맨 앞 비트 하나가 늘 0 으로 남습니다.

packet-beta
0: "남는 비트"
1-7: "글자 번호 0~127"

옛 통신 장비는 이 비트를 오류 검사에 썼습니다. 1 의 개수가 짝수가 되도록 값을 채워 두고, 받는 쪽이 개수를 세어 어긋나면 전송이 깨진 것으로 보는 방법입니다. 이때 쓰는 비트를 패리티 비트라고 부릅니다.

통신이 안정되면서 이 비트가 놀게 됐습니다. 그러자 나라마다 이 비트를 살려 128번부터 255번까지 자기 글자를 채워 넣었습니다. 프랑스어의 악센트 글자, 그리스 글자, 키릴 글자가 각각 다른 표로 들어갔습니다.

문제는 128번 위쪽이 표마다 다르다는 것입니다. 같은 바이트 값이 어느 표로 읽느냐에 따라 다른 글자가 됩니다. 어느 표로 적었는지를 따로 알려 주지 않으면 받는 쪽은 글자를 잘못 읽습니다. 오래된 웹 문서와 첨부 파일에서 글자가 깨져 보이는 일이 여기서 비롯됐습니다.

이 표가 못 담는 글자

ASCII 표에는 영어 알파벳과 숫자, 기본 문장 부호밖에 없습니다. 한글도 한자도 이모지도 번호가 없습니다. 악센트가 붙은 유럽 글자도 마찬가지입니다.

담는 글자가 적은 만큼 셈은 단순합니다. 글자 수와 바이트 수가 같고, n 번째 글자는 곧 n 번째 바이트입니다. 문자열을 아무 데서나 잘라도 글자가 반으로 쪼개지지 않습니다.

여러 바이트로 한 글자를 적는 인코딩에서는 이 셋이 전부 깨집니다. 글자 수와 바이트 수가 갈리고, n 번째 글자를 찾으려면 앞에서부터 세어야 하고, 바이트 수로 자른 문자열은 글자 한가운데서 끊길 수 있습니다.

오늘날 ASCII 가 남아 있는 곳

UTF-8(Unicode Transformation Format 8-bit, 유니코드 변환 형식 8비트)은 0번부터 127번까지를 ASCII 와 같은 바이트 값으로 적습니다. 그래서 영어로만 된 ASCII 파일은 한 바이트도 바꾸지 않고 UTF-8 파일이 됩니다.

세상의 모든 글자에 번호를 매긴 유니코드도 앞쪽 128개 번호를 ASCII 에서 그대로 가져왔습니다. 오늘날 글자에 붙는 번호의 첫 128칸은 여전히 이 표입니다.

통신 규약의 뼈대도 아직 ASCII 입니다. HTTP(HyperText Transfer Protocol) 의 메서드 이름과 헤더 이름, URI(Uniform Resource Identifier) 에 쓸 수 있는 글자, JSON(JavaScript Object Notation) 문서의 문법 기호가 모두 이 표 안에서 고른 것입니다.

ASCII 밖 바이트를 못 지나가게 하는 통로도 남아 있습니다. 옛 메일 통로가 그렇습니다. 그래서 그림이나 한글을 실을 때는 Base64 처럼 바이트를 ASCII 글자만으로 다시 적는 방법을 씁니다.

관련 항목

ASCII 가 속하는 상위 분류

문자 인코딩 · 문자 집합 · 포맷 · 텍스트 파일

ASCII 의 번호를 물려받거나 확장한 인코딩

UTF-8 · UTF-16 · 유니코드 · ISO-8859-1 · CP949 · EUC-KR · Shift_JIS · windows-1252

ASCII 표 안에 들어 있는 문자 종류

제어 문자 · 개행 문자 · 널 문자 · 공백 문자 · 문장 부호

ASCII 글자만 지나가는 통로에서 쓰는 전송 방식

Base64 · quoted-printable · MIME · 퍼센트 인코딩 · 7bit

ASCII 를 문법에 쓰는 프로토콜과 포맷

HTTP · URI · JSON · XML · SMTP · CSV

ASCII 를 바이트로 다룰 때 쓰는 단위와 연산

비트 · 바이트 · 비트 연산 · 패리티 비트 · 십육진수

다른 이름: ascii · 아스키 · American Standard Code for Information Interchange · 미국 정보 교환 표준 부호