“Hello”를 입력해서 컴퓨터가 저장할 때, 실제로 저장되는 것은 숫자 열 72, 101, 108, 108, 111입니다. 문자와 숫자 사이의 이 매핑이 ASCII이며, 이를 이해하면 컴퓨터가 텍스트, 프로토콜, 데이터 교환을 처리하는 방식에 대한 깊은 통찰을 얻을 수 있습니다.

텍스트를 ASCII 코드로 즉시 변환 →

ASCII란?

ASCII(American Standard Code for Information Interchange)는 1963년 미국표준협회가 발표한 문자 인코딩 표준입니다. 128개 문자(영문자, 숫자, 구두점, 제어 코드)를 0부터 127까지의 정수에 매핑하고, 각 문자는 7비트로 저장됩니다.

원래 설계 제약은 전신 회선이었습니다. 전송 효율을 위해 각 문자가 7비트에 맞아야 했습니다. 1963년의 이 결정이 오늘날 모든 프로그래밍 언어의 텍스트 처리에 여전히 영향을 미치고 있습니다.

ASCII 범위:

  • 0〜31: 제어 문자 (비표시)
  • 32〜126: 출력 가능한 문자 (영문자, 숫자, 구두점, 공백)
  • 127: DEL (삭제 제어 문자)

전체 ASCII 문자셋은 7비트에 맞지만, 컴퓨터는 바이트(8비트) 단위로 데이터를 저장합니다. 여분의 8번째 비트 덕분에 나중에 Latin-1이나 코드 페이지 같은 확장 인코딩이 추가될 수 있었습니다.

ASCII 문자 테이블 핵심 포인트

제어 문자 (0〜31)

장치 제어와 텍스트 서식 지정에 사용되는 비표시 문자입니다:

10진16진약어의미
000NUL널 문자
707BEL벨 (터미널 비프음)
808BS백스페이스
909HT수평 탭
100ALF줄 바꿈 (Unix 줄바꿈 \n)
130DCR캐리지 리턴 (\r)
271BESC이스케이프 (ANSI 터미널 시퀀스)

CR+LF(\r\n) 조합——10진수 13과 10——은 Windows 줄 끝 문자입니다. CR(인쇄 헤드를 줄 시작으로 이동)과 LF(종이를 한 줄 위로 올림)라는 기계식 텔레타이프 동작에서 직접 유래했습니다.

출력 가능한 문자 (32〜126)

32  공백    48  0    65  A    97  a
33  !       49  1    66  B    98  b
34  "       50  2    67  C    99  c
...

프로그래밍에서 기억해 둘 핵심 값:

문자10진16진
공백3220
04830
A6541
a9761
Z905A
z1227A

대문자와 소문자의 차이는 항상 정확히 32(0x20)입니다. ASCII 바이트의 5번째 비트를 토글하면 대소문자가 전환됩니다. 성능에 민감한 파서에서 여전히 사용되는 기법입니다.

숫자 09는 48부터 시작하므로, '5' - 48 = 5로 ASCII 숫자 문자를 정수 값으로 변환할 수 있습니다. 커스텀 문자열-정수 파서의 기초입니다.

ASCII vs Unicode vs UTF-8

이 세 용어는 자주 혼동됩니다. 관계를 정리하면:

ASCII는 128개 문자를 다루는 7비트 인코딩입니다. 영어를 위해 설계되었으며 비라틴 문자는 포함하지 않습니다.

Unicode는 모든 문자 체계의 모든 문자에 고유한 코드 포인트를 할당하는 표준입니다——Unicode 15.1 기준 149,000자 이상. Unicode 자체는 인코딩이 아닌 문자셋입니다. U+0041은 “A”의 코드 포인트입니다. 각 번호가 어떤 문자를 나타내는지를 정의하지만, 바이트로 저장하는 방법은 규정하지 않습니다.

UTF-8은 Unicode 코드 포인트를 바이트로 인코딩하는 방식 중 하나입니다. 가변 길이 방식입니다:

  • 코드 포인트 0〜127 (전체 ASCII 범위): 1바이트, ASCII와 동일
  • 코드 포인트 128〜2047: 2바이트
  • 코드 포인트 2048〜65535: 3바이트
  • 코드 포인트 65535 초과: 4바이트

핵심: UTF-8은 ASCII의 상위 집합입니다. 순수 ASCII 문서는 그대로 유효한 UTF-8 문서입니다.

기타 Unicode 인코딩:

  • UTF-16: 문자당 2 또는 4바이트. Windows, Java, JavaScript 내부 문자열 표현에서 사용. ASCII 호환 불가.
  • UTF-32: 문자당 고정 4바이트. 단순하지만 주로 ASCII 콘텐츠에는 낭비적입니다.
  • Latin-1 (ISO 8859-1): ASCII의 8비트 확장으로, 서유럽 언어 문자를 128〜255에 추가합니다. UTF-8과 자주 혼동되지만 127 이상의 문자에서는 호환되지 않습니다.

코드에서 ASCII 다루기

JavaScript

// 문자에서 ASCII 코드로
'A'.charCodeAt(0);        // 65
'a'.charCodeAt(0);        // 97
' '.charCodeAt(0);        // 32

// ASCII 코드에서 문자로
String.fromCharCode(65);  // 'A'
String.fromCharCode(72, 101, 108, 108, 111); // 'Hello'

// 문자열을 ASCII 코드 배열로 변환
function toAsciiCodes(str) {
  return [...str].map(c => c.charCodeAt(0));
}
toAsciiCodes('Hello'); // [72, 101, 108, 108, 111]

// ASCII 대문자인지 확인
function isUpperCase(char) {
  const code = char.charCodeAt(0);
  return code >= 65 && code <= 90;
}

// 비트 연산으로 대소문자 전환
function toggleCase(char) {
  return String.fromCharCode(char.charCodeAt(0) ^ 32);
}
toggleCase('A'); // 'a'
toggleCase('a'); // 'A'

Python

# 문자에서 ASCII 코드로
ord('A')           # 65
ord('\n')          # 10
ord(' ')           # 32

# ASCII 코드에서 문자로
chr(65)            # 'A'
chr(72)            # 'H'

# 문자열을 코드 목록으로
[ord(c) for c in 'Hello']  # [72, 101, 108, 108, 111]

# 코드를 문자열로
''.join(chr(c) for c in [72, 101, 108, 108, 111])  # 'Hello'

# ASCII 범위 확인
def is_ascii(s: str) -> bool:
    return all(ord(c) < 128 for c in s)

# Python 3 내장 메서드
'Hello'.isascii()  # True
'Héllo'.isascii()  # False

Go

package main

import "fmt"

func main() {
    // 문자에서 코드 포인트(rune)로
    r := 'A'
    fmt.Println(int(r))   // 65

    // 코드 포인트에서 문자로
    fmt.Printf("%c\n", 65) // A

    // 문자열 바이트 반복 (ASCII 범위)
    for i, b := range []byte("Hello") {
        fmt.Printf("%d: %c = %d\n", i, b, b)
    }
    // 0: H = 72
    // 1: e = 101
    // ...

    // XOR로 대소문자 전환
    fmt.Printf("%c\n", 'A'^32) // a
    fmt.Printf("%c\n", 'a'^32) // A
}

ASCII 코드의 실용적 활용

프로토콜 구분자

많은 인터넷 프로토콜은 ASCII 기반으로 설계되었습니다. HTTP 헤더, SMTP 명령, FTP 제어 메시지, CSV 파일 모두 ASCII 문자를 구분자로 사용합니다:

  • CSV는 ,(44)와 \r\n(13, 10) 사용
  • HTTP 헤더는 \r\n\r\n(13, 10, 13, 10)으로 종료
  • SMTP 명령은 \r\n으로 종료되는 일반 ASCII 줄
  • C의 널 종료 문자열은 NUL(0)을 문자열 종료자로 사용

터미널 제어 시퀀스

ESC 문자(27, \x1b)는 터미널 출력에 색상과 커서 이동을 추가하는 ANSI 이스케이프 코드의 기초입니다:

# 터미널에서 빨간 텍스트
print('\x1b[31m빨간색입니다\x1b[0m')

# 굵은 텍스트
print('\x1b[1m굵은 텍스트입니다\x1b[0m')

# 커서를 3줄 위로 이동
print('\x1b[3A')

정렬과 비교

ASCII 순서가 문자열 비교 동작을 결정합니다. 대문자(65〜90)가 소문자(97〜122)보다 앞에 오고, 숫자(48〜57)는 둘 다보다 앞에 옵니다. 대부분의 언어에서 'Z' < 'a'가 참인 이유가 여기 있습니다.

데이터 인코딩

바이너리 데이터가 ASCII 전용 채널(이메일, HTTP, URL)을 통해 전송되어야 할 때, ASCII 안전한 표현으로 인코딩됩니다. Base64는 A〜Z, a〜z, 0〜9, +, /를 사용합니다. 퍼센트 인코딩은 바이트를 %XX 16진수 시퀀스로 변환합니다.

온라인에서 ASCII로 변환

ZeroTool의 ASCII 변환기는 임의의 텍스트를 ASCII(10진, 16진, 2진) 표현으로 실시간 변환하고, 코드에서 텍스트로의 역변환도 지원합니다. 전체 출력 가능 ASCII 범위를 처리하며 빠른 참조를 위한 문자 테이블도 보여줍니다.

ZeroTool ASCII 변환기 사용해보기 →