[1주1장 CS] 컴퓨터는 어떻게 문자를 나타낼까?

태그 1주1장 CS 분류 1주1장 CS

한 주에 한 장씩 읽는 컴퓨터과학. 이번 주는 컴퓨터에서 어떻게 문자를 나타내는지 알아봅니다.


chevron_right

목차


서론

이번 주의 주제, “컴퓨터는 어떻게 문자를 나타낼까?”입니다.

인코딩/디코딩

컴퓨터는 문자를 바로 처리할 수 없습니다. 컴퓨터가 직접적으로 처리할 수 있는 것은 이진수 뿐입니다. 따라서 우리가 문자를 표현하기 위해서는 문자를 숫자로 표현하고, 그 반대도 할 수 있어야 합니다. 그 방법을 뭐라고 부를까요?

컴퓨터과학 분야에서 문자와 같은 데이터를 바이너리로 바꾸는 방법이나 규칙을 인코딩이라고 합니다. 반대말은 디코딩입니다.

컴퓨터가 처리할 수 있는 이진수로 문자를 표현하기 위해서 문자마다 해당하는 숫자를 할당해둡니다. 우리는 그 규칙에 따라서 문자를 숫자로 인코딩하고, 그 역으로 숫자를 다시 문자로 디코딩하는 것이죠. 이제 그 대표적인 규칙들을 알아봅시다.

대표적인 인코딩

아스키 코드(ASCII)

아스키 코드는 미국 ANSI에서 정보 처리, 교환 시스템 등을 위해서 만든 7비트의 문자와 코드 집합으로, 128개의 제어 문자와 숫자, 일반적인 문자와 기호들, 그리고 그들에 해당하는 부호를 정의합니다[1].

아스키 코드는 컴퓨터를 비롯한 장치에 널리 사용되며, 유니코드와 같은 다른 인코딩에도 영향을 주었습니다. 하지만 다른 언어를 표기하기에는 어려움이 있었기에 8비트 확장 등이 등장하기도 했습니다.

아스키 코드표를 확인하려면 위키백과를 참고하세요.

EUC-KR/CP949

EUC-KR은 보통 아스키 코드[*1]와 KS X 1001을 같이 사용하는 인코딩을 말합니다[2]. 사실 이 인코딩은 한국 외에서는 거의 사용되지 않는 인코딩이지만, 한국에서는 아직도 그 영향력이 남아 있습니다. 이 인코딩은 한글 문자 전부를 표현할 수는 있지만(한글 채움 문자), 대부분은 한글 채움 문자를 구현하지 않아 완성형 낱자 2350자만 표현할 수 있습니다.

CP949는 EUC-KR의 확장판으로, EUC-KR에서 표현할 수 없는 한글 완성형 낱자 모두를 표현할 수 있습니다. 한국어 원도우에서는 여전히 사용되는 인코딩입니다.

원도우에서는 지역 별로 CP949나 Shift_JIS처럼 국가별로 다른 인코딩을 사용하기도 합니다. 지역 설정에서 “Beta: 세계 언어 지원을 위해 Unicode UTF-8 사용”을 사용할 수 있지만, 아직 기본 설정은 아닙니다. 이로 인해 호환성 문제가 발생하고, 문자가 깨지기도 합니다.

유니코드

유니코드는 범용적인 문자 인코딩 표준으로, 지역별로 인코딩이 파편화되는 일 없이 다국어 텍스트를 일관적으로 인코딩할 수 있습니다. 유니코드는 HTML과 XML의 기본 인코딩이기도 합니다[3].

유니코드를 표현하는 방식은 크게 32비트 형태인 UTF-32와 16비트 형태인 UTF-16, 그리고 가장 널리 쓰이는 8비트 형태인 UTF-8이 있습니다. UTF-8은 아스키 코드와도 일부 호환됩니다[3].

유니코드는 한글 완성형 낱자 모두, 그리고 조합형을 통해 옛한글까지도 표현할 수 있습니다.

예시

간단히 Python으로 아스키 코드와 유니코드, 그리고 EUC-KR을 인코딩, 디코딩하는 예시를 보겠습니다.

> import codecs
> print(ord('A')) # 아스키 코드 인코딩
65
> print("%d U+%X" % (ord('가'), ord('가'))) # 유니코드 인코딩
44032 U+AC00
> print(codecs.encode('가', 'euc-kr').hex().upper()) # EUC-KR 인코딩
B0A1
> print(chr(65)) # 아스키 코드 디코딩
A
> print(chr(0xac00)) # 유니코드 디코딩

> print(codecs.decode(bytes.fromhex('B0A1'), 'euc-kr')) # EUC-KR 디코딩

같은 글자 인코딩 방식에 따라서 다르게 표현되는 것을 알 수 있습니다. 유니코드에서는 U+AC00으로 표현되고, EUC-KR에서는 B0A1으로 표현됩니다. 이렇게 인코딩은 문자를 변환하는 방법을 정의합니다.

정리

  • 컴퓨터는 이진법만 처리 → 문자를 숫자로 표현해야 함
  • 인코딩: 문자 → 숫자, 디코딩: 숫자 → 문자
  • 대표적인 인코딩
    • 아스키 코드: 7비트 문자 집합, 128개 문자 → 영어, 숫자, 기호.
    • EUC-KR/CP949: 아스키 코드 + KS X 1001, 한글 완성형 낱자 2350자.
    • 유니코드: 범용 문자 인코딩 표준, UTF-8, UTF-16, UTF-32 등으로 표현 가능. 모든 한글 완성형, 조합형, 옛한글 표현 가능.

각주

  1. [*1] 엄밀히 말하면 KS X 1003을 지칭하지만, 일반적으로 아스키 코드와 동일하게 취급됩니다.

참고 자료

  1. [1]
    American National Standards Institute (ANSI), "American National Standard for Information Systems — Coded Character Sets — 7-Bit American National Standard Code for Information Interchange (7-Bit ASCII)," ANSI X3.4-1986 (Technical report), 1986. Accessed: Apr. 5, 2025. [Online]. Available: https://www.unicode.org/L2/L2006/06388-review-incits4.pdf
    [↑]
  2. [2]
    "KS X 1001." e나라표준인증. Accessed: Apr. 5, 2025. [Online]. Available: https://standard.go.kr/KSCI/standardIntro/getStandardSearchView.do?ksNo=KSX1001
    [↑]
  3. [3]
    Unicode, Inc. "Chapter 1 - Unicode 16.0.0." Unicode. Accessed: Apr. 5, 2025. [Online]. Available: https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-1/
    [↑] [↑]

용어

label
바이너리
0과 1로 데이터를 나타내는 방법
label
인코딩
Encoding; 암호화, 부호화
label
디코딩
Decoding; 복호화
label
ANSI
American National Standards Institute; 미국 국가표준 협회

인용하기
BibTeX
@misc{devngho202520250405weeklycscharincomputers,
  author       = {Yu, Dongho},
  title        = {컴퓨터는 어떻게 문자를 나타낼까?},
  howpublished = {\url{https://ngho.dev/posts/20250405-weekly-cs-char-in-computers}},
  year         = {2025},
  month        = {apr},
  note         = {Accessed: 2025-04-26}
}

APA 유동호. (2025년 4월 5일). 컴퓨터는 어떻게 문자를 나타낼까?. devngho 블로그. https://ngho.dev/posts/20250405-weekly-cs-char-in-computers

Chicago 유동호. “컴퓨터는 어떻게 문자를 나타낼까?.” devngho 블로그, 2025년 4월 5일, https://ngho.dev/posts/20250405-weekly-cs-char-in-computers.

MLA 유동호. “컴퓨터는 어떻게 문자를 나타낼까?.” devngho 블로그, 2025년 4월 5일, https://ngho.dev/posts/20250405-weekly-cs-char-in-computers.