ASCII와 유니코드: 무엇이고 어디에 쓸까

컴퓨터는 숫자만 이해해요. 그래서 화면에 보이는 글자 하나하나가 코드예요. ASCII는 표준이 된 첫 번째 코드표이고, 유니코드는 지금 우리가 모든 언어로 글을 쓸 때 쓰는 코드표예요. 어떻게 작동하는지, 알아 두면 좋은 코드, 가끔 한글이나 악센트 대신 이상한 기호가 나타나는 이유, 표에서 모두 확인하는 방법을 알려 드려요.

업데이트:

문자 인코딩이란

인코딩은 약속이에요. 「숫자 65는 글자 A를 뜻한다」는 식이에요. 글을 쓰면 프로그램이 그 숫자를 저장하고, 다른 사람이 열면 그 사람의 프로그램이 같은 약속으로 숫자를 다시 글자로 바꿔요. 두 쪽이 같은 표를 쓰지 않으면 글이 엉망으로 나와요.

두 가지 개념을 구분해야 해요. 하나는 문자 집합으로, 어떤 숫자가 어떤 기호에 해당하는지의 목록이에요. 다른 하나는 그 숫자를 바이트로 저장하는 방법이에요. ASCII에서는 둘이 단순하게 일치하지만 유니코드에서는 그렇지 않고, 여기서 UTF-8이 등장해요.

ASCII: 7비트 128자

ASCII(American Standard Code for Information Interchange의 약자)는 1960년대에 표준이 되었어요. 7비트, 즉 2의 7제곱 = 128개의 코드를 써요. 0부터 127까지예요. 그중 33개는 제어 문자(0~31과 127)이고 95개는 출력 가능한 문자(공백을 포함한 32~126)예요.

악센트가 있는 글자, ñ, 유로 기호는 없어요. 영어를 위해 설계되었기 때문이에요. 그래서 나중에 다른 표가 필요해졌어요.

가장 자주 만나게 될 코드예요. 공백(32)은 보이지 않지만 출력 가능한 문자로 쳐요.
제어 문자10진수16진수2진수 (7비트)용도
널 (NUL)0000000000여러 언어에서 문자열의 끝을 나타내요
가로 탭 (TAB)9090001001다음 탭 위치로 이동해요
줄 바꿈 (LF)100A0001010다음 줄로 내려가요
캐리지 리턴 (CR)130D0001101줄의 처음으로 돌아가요
이스케이프 (ESC)271B0011011제어 시퀀스를 시작해요
공백32200100000출력 가능한 첫 번째 문자예요
삭제 (DEL)1277F1111111문자를 지워요

기억해 두면 좋은 관계

표는 아무렇게나 정렬된 게 아니에요. 몇 가지 규칙성을 알면 코드를 외워서 읽을 수 있어요.

줄 끝: LF, CR, CRLF

줄 바꿈은 단순해 보이지만 시스템마다 다르게 써요. 유닉스, 리눅스, macOS는 LF(10) 한 글자를 써요. Windows는 CR과 LF(13과 10) 두 글자를 연달아 쓰고 CRLF라고 불러요. 옛날 텔레타이프에는 캐리지를 처음으로 돌리는 명령과 종이를 한 줄 올리는 명령이 따로 필요했어요.

이 차이 때문에 기본 편집기에서 파일이 모두 한 줄로 보이거나, 줄 끝마다 이상한 기호가 보이는 일이 생겨요. 각각의 코드가 궁금하다면 ASCII 코드표의 검색창에 LF나 CR을 입력해 보세요.

「확장 ASCII」는 표준이 아니에요

1바이트는 8비트인데 ASCII는 7비트만 써서 128개의 코드(128~255)가 비어 있었고, 제조사와 지역마다 제각각 채웠어요. 이것을 「확장 ASCII」라고 부르지만 하나의 표가 있는 게 아니에요. 코드 페이지라고 부르는 여러 표가 있어요. 가장 잘 알려진 두 가지는 é가 233번인 Latin-1(ISO-8859-1)과, 비슷하지만 128~159번에 차이가 있는 Windows-1252예요(예를 들어 유로가 여기에 있어요).

문제는 233번이 어떤 표에서는 「é」를 뜻하고 다른 표에서는 다른 것을 뜻한다는 거예요. 한 표로 쓴 글을 다른 표로 읽으면 쓰레기 글자가 나타났어요. 유니코드는 이 혼란을 끝내려고 만들어졌어요.

유니코드와 UTF-8

유니코드는 거의 모든 세계의 문자 체계의 글자, 그리고 기호와 이모지에 코드 포인트라는 고유한 번호를 부여해요. 지금은 15만 개가 넘는 글자가 있어요. U+ 접두어와 16진수로 써요. 「A」는 U+0041, 「ñ」은 U+00F1, 유로는 U+20AC, 웃는 얼굴 이모지는 U+1F600이에요. 처음 128개의 코드 포인트는 ASCII와 정확히 같아요.

UTF-8은 이 숫자를 바이트로 저장하는 가장 널리 쓰이는 방식으로, 글자에 따라 1~4바이트를 써요. ASCII 128자는 예전과 같은 1바이트라서 ASCII 텍스트는 그대로 유효한 UTF-8 텍스트예요. 나머지는 더 많은 바이트를 차지해요. 한글은 보통 3바이트예요.

ASCII에서 멀어질수록 글자가 차지하는 바이트가 늘어요.
문자코드 포인트UTF-8 바이트 수바이트 (16진수)
AU+0041141
éU+00E92C3 A9
ñU+00F12C3 B1
€U+20AC3E2 82 AC
😀U+1F6004F0 9F 98 80

「ñ」 대신 「ñ」가 나타나는 이유

가장 흔한 오류이고 정확한 이유가 있어요. UTF-8에서 ñ은 C3과 B1 두 바이트예요. 프로그램이 텍스트를 Latin-1이라고 믿으면 바이트를 하나씩 글자로 읽어요. C3은 「Ã」, B1은 「±」예요. 결과는 「ñ」예요. 「é」가 「é」로, 「canción」이 「canción」으로 보이는 것도 같은 이유예요.

해결책은 거의 항상 프로그램에 파일을 UTF-8로 열라고 알려 주는 거예요(텍스트 편집기에서, 또는 스프레드시트 가져오기 설정에서). 반대로 Latin-1 텍스트를 UTF-8로 읽으면 물음표가 있는 마름모가 자주 나타나요. 흩어진 바이트가 유효한 UTF-8 시퀀스를 이루지 못하기 때문이에요. 한글이 깨져 보이는 현상도 같은 원리로 일어나요.

ASCII 코드표와 변환기 사용법

「ASCII 코드표」 도구는 128자를 10진수, 16진수, 8진수, 2진수 코드와 함께 보여 주고 제어 문자의 이름도 알려 줘요.

  1. 「문자 또는 코드 검색」에 문자, 코드, 제어 문자의 이름(예: A, 65, 41, LF)을 입력하면 그 행을 찾아요.
  2. 필터 버튼(제어 문자, 숫자, 대문자, 소문자, 기호)으로 한 그룹만 볼 수 있어요.
  3. 변환하려면 「텍스트」에 텍스트를 입력하고 「코드 형식」(10진수, 16진수, 8진수, 2진수)을 고르세요. 아래에 코드가 나타나요. 「Hola」는 10진수로 72 111 108 97, 16진수로 48 6F 6C 61이에요.
  4. 반대로도 할 수 있어요. 「코드」에 공백이나 쉼표로 구분한 코드를 붙여 넣으면 텍스트가 만들어져요. 16진수에서는 0x41 같은 접두어도 받아요.

텍스트에 ñ처럼 ASCII가 아닌 글자가 있으면 도구가 알려 주고 유니코드 코드를 보여 줘요. UTF-8의 실제 바이트를 보려면 「텍스트를 2진수로」를 쓰세요. ñ은 8비트 두 바이트인 11000011 10110001이에요. 한계도 있어요. 표에는 확장 ASCII가 아닌 표준 ASCII만 있고, 모든 계산은 텍스트를 서버로 보내지 않고 브라우저에서 이뤄져요.

자주 묻는 질문

ASCII에는 글자가 몇 개 있어요?

128개로, 코드는 0부터 127까지이고 각각 7비트예요. 그중 33개는 제어 문자이고 95개는 공백을 포함한 출력 가능한 문자예요.

글자 A와 a의 ASCII 코드는 뭐예요?

「A」는 65(16진수 41, 2진수 01000001)이고 「a」는 97(16진수 61, 2진수 01100001)이에요. 항상 32 차이가 나요.

ASCII와 유니코드는 뭐가 달라요?

ASCII는 영어를 위한 128자예요. 유니코드는 거의 모든 언어와 이모지를 담은 15만 자 이상이고, 처음 128자는 ASCII와 같아요.

UTF-8이 뭐예요?

유니코드 텍스트를 바이트로 저장하는 가장 널리 쓰이는 방식이에요. 글자마다 1~4바이트를 써요. ASCII는 1바이트, ñ은 2바이트, 이모지는 4바이트예요.

텍스트가 왜 「ñ」나 「é」로 보여요?

UTF-8로 저장된 텍스트를 Latin-1로 읽고 있기 때문이에요. 파일을 열 때 UTF-8 인코딩을 지정하면 해결돼요.