[CS] 문자 인코딩(Character Encoding)

2024. 10. 9. 23:51·ETC
728x90
반응형

컴퓨터의 데이터 저장 방식

컴퓨터는 0과 1로 이루어져 있다는 말을 많이 들었을 것이다. 실제로 컴퓨터의 메모리는 0과 1을 표현할 수 있는 트랜지스터들이 모여 구성되며, 이를 통해 여러 2진수 값을 저장함으로써 데이터를 저장한다. 컴퓨터는 10진수를 이해하지 못하기 때문에 우리가 표현하려는 수를 2진수로 변경해서 저장해야 한다. 2진수로 변경하는 방법은 간단한 수학 공식을 적용하면 되는데, 이에 대해서는 '진법 변환'에 대해 검색해 보길 바란다!

오케이, 숫자는 2진수로 변경해서 저장하면 된다는 것을 알았다. 그렇다면 숫자가아닌 문자는 어떻게 메모리에 저장할 수 있을까?
그 해답은 문자를 숫자에 매핑시키는 것에 있다. 즉, '문자 집합(Character set)'을 만들고, 각 문자에 숫자를 연결시키는 것이다.





예를 들면, 문자 'A'를 숫자 65와 매핑시킨다면, 우리가 문자 'A'를 저장할 때, 컴퓨터는 문자 집합을 참조하여 'A'의 숫자 값인 65를 찾고, 이를 2진수로 변환하여 메모리에 저장한다.


문자 -> 숫자 변환을 '문자 인코딩(Character Encoding)'이라고 하고, 숫자 -> 문자 변환을 '문자 디코딩(Character Decoding)'이라고 한다. 꼭 그런 것은 아니지만, 문자 인코딩은 데이터를 컴퓨터에 저장할 때 수행해야 하는 작업이고, 문자 디코딩은 컴퓨터에 저장되어 있는 2진수로 된 데이터를 우리가 이해할 수 있게 변환하는 작업이라고 생각하면 편하다.

문자집합의 역사

문자집합을 통해 문자도 컴퓨터에 저장할 수 있게 되었다. 하지만, 문자 집합에 대한 표준이 없다면 다양한 사람들이 자신만의 문자 집합을 만들어서 사용하게 될 것이고, 때문에 서로 다른 컴퓨터에서는 문자가 올바르게 매핑되지 않는 문제가 발생할 것이다. 즉, 호환성 문제가 발생한다.

이를 해결하기 위해 역사 속에서 수많은 문자 집합들이 탄생했고, 지금부터 대표적인 문자 집합들 몇 개를 함께 알아보도록 하자!

ASCII 문자 집합

  • 7비트를 사용하여 총 128가지 문자를 표현할 수 있는 문자 집합
  • 최초의 문자 집합
  • 초기 컴퓨터에서는 주로 영문 알파벳, 숫자, 키보드의 특수문자, 스페이스, 엔터와 같은 기본적인 문자만 표현하면 충분했기에 128가지 문자밖에 존재하지 않는다

ISO_8859_1

  • 서유럽 문자를 표현하는 문자 집합의 필요성으로 인해 1980년도에 등장한 문자 집합
  • 기존 ASCII + 서유럽 문자
  • ISO_8859_1, LATIN1, ISO-LATIN-1 등으로 불림
  • 8bit(1byte) 문자 집합 -> 총 256가지 표현 가능
  • 기존 7비트 ASCII는 그대로 유지하고, 128가지 문자만 추가한 것 => ASCII 호환 가능!

EUC-KR

  • 한글 표현이 가능한 문자 집합의 필요성으로 인해 1980년도에 등장한 문자 집합 (최초 X)
  • 모든 한글을 담기 보다는 자주 사용하는 한글 2350개만 포함해서 만듦
  • (ASCII + 자주 사용하는 한글 2350개 + 한국에서 자주 사용하는 기타 글자)로 구성됨 => ASCII 호환 가능!
  • ASCII는 1byte, 한글은 2byte를 사용 (= 영어는 1byte, 한글은 2byte를 사용하여 메모리에 저장)

MS949

  • 1990년도에 마이크로소프트가 EUC-KR을 확장하여 만든 인코딩
  • EUC-KR은 자주 사용하는 글자만 등록했음 -> 드물게 사용되는 음절을 표현하지 못한다는 단점..
  • 기존 EUC-KR과 호환을 이루면서 한글 11,172자를 모두 수용하도록 만든 것이 MS949 => 당연히 ASCII 호환 가능
  • EUC-KR과 마찬가지로 ASCII는 1byte, 한글은 2byte 사용
  • 여전히 윈도우 시스템에서 계속 사용됨

유니코드의 등장

전 세계적으로 컴퓨터 인구가 늘어나면서, 전 세계 문자를 대부분 다 표현할 수 있는 문자 집합이 필요해졌다. 많은 문자 집합들이 등장하긴 했지만, 이들은 모두 특정 언어 또는 문자 세트를 대상으로 했기 때문에 국제적으로 호환성 문제가 많았다..
=> 이를 해결하기 위해 전 세계의 모든 문자들을 단일 문자 세트로 표현할 수 있는 유니코드(Unicode) 표준이 1990년대에 도입

UTF-16

  • 16bit(2byte) 기반으로, 자주 사용하는 기본 다국어들은 2byte를, 그 외는 4byte를 사용하여 표현 가능하다.
    • 기본으로 2byte or 4byte를 사용
  • 단점
    • ASCII 영문도 2byte를 사용하여 표현하게 되면서, 기존 ASCII와 호환되지 않음..
    • ASCII에 비해 영문의 경우 용량이 2배 더 커서 메모리도 2배 더 사용하게 됨
  • 초반에는 UTF-16이 인기, 이 시기에 등장한 자바도 언어 내부적으로 문자를 표현할 때 UTF-16을 사용함, 그래서 자바의 char 타입이 2byte를 사용함
  • 대부분의 문자를 2byte로 처리하기 때문에 계산 편리

UTF-8

  • 8bit(1byte) 기반, 가변길이 인코딩
  • 1byte ~ 4byte를 사용해서 문자를 인코딩
    • 1byte: ASCII, 영문, 기본 라틴 문자
    • 2byte: 그리스어, 히브리어 라틴 확장 문자
    • 3byte: 한글, 한자, 일본어
    • 4byte: 이모지, 고대문자등
  • 단점
    • 각 문자가 가변 길이로 인코딩되어 상대적으로 사용이 복잡함
    • ASCII를 제외한 일부 언어에서 더 많은 용량 사용..
      • 한글, 한자, 아랍어, 히브리어와 같은 문자들은 UTF-8에서 3바이트 또는 4바이트를 차지하는 반면, UTF-16에서는 이들 문자가 대부분 2바이트로 인코딩 됨
  • 장점: ASCII 문자는 1바이트로 표현하는 것을 유지함 => ASCII 호환 가능
  • 현대의 사실상 표준 인코딩 기술

UTF-8이 현대의 사실상 표준 인코딩 기술이 된 이유

  • 저장 공간 절약과 네트워크 효율성**: UTF-8은 ASCII 문자를 포함한 많은 서양 언어의 문자에 대해 1바이트를 사용한다. 반면에 UTF-16은 최소 2바이트를 사용하므로, 주로 ASCII 문자로 이루어진 영문 텍스트에서는 UTF-8이 2배 더 효율적이다. 특히 데이터를 네트워크로 전달할 때는 매우 큰 효율의 차이를 보인다. 참고로 웹에 있는 문서의 80% 이상은 영문 문서이다.
  • ASCII와의 호환성: UTF-8은 ASCII와 호환된다. UTF-8로 인코딩 된 텍스트에서 ASCII 범위에 있는 문자는 기존 ASCII와 동일한 방식으로 처리된다. 예를 들어 문자 "A"는 65로 인코딩 된다. 많은 레거시 시스템은 ASCII 기반으로 구축되어 있다. UTF-8은 이러한 시스템과의 호환성을 유지하면서도 전 세계의 모든 문자를 표현할 수 있다.

참고

한글 윈도우의 경우 기존 윈도우와 호환성 때문에 기본 인코딩을 MS949로 유지한다. 한글 윈도우도 기본 인코딩을 UTF-8로 변경하려고 노력 중이다.

인코딩 - 디코딩이 다른 경우

  • 영문 인코딩의 경우: ASCII에 포함되는 영문은 UTF-16을 제외한 대부분의 문자 집합에서 호환된다
  • 한글 인코딩의 경우
    • UTF-8과 EUC-KR(or MS949)는 서로 호환되지 않는다!
    • EUC-KR과 MS949는 경우에 따라 호환 여부가 다르다
      • 단순한 문자의 경우: EUC-KR과 MS949는 서로 호환된다(MS949는 EUC-KR의 확장판)
      • 복잡한 문자의 경우: EUC-KR로 디코딩할 수 없다

한글이 깨지는 가장 큰 2가지 이유

  • EUC-KR(MS949), UTF-8을 섞어서 사용하는 경우
    • UTF-8로 인코딩한 한글을 EUC-KR(MS949)로 디코딩하거나, 혹은 그 반대의 경우라면 서로 호환되지 않아 한글이 깨진다
  • EUC-KR(MS949) 또는 UTF-8로 인코딩한 한글을 ISO-8859-1로 디코딩하는 경우
    • ISO-8859-1은 한글을 지원하지 않는다. 한글을 지원하는 EUC-KR(MS949) 또는 UTF-8로 인코딩한 후, ISO-8859-1로 디코딩을 시도하면 한글이 깨진다
728x90
반응형

'ETC' 카테고리의 다른 글

[오브젝트 - 기초편] 영화 예매 도메인 예제  (3) 2024.12.30
[Design Pattern] Structural Pattern  (0) 2024.11.04
[Design Pattern] Behavioral Pattern(행동 패턴) - 2  (3) 2024.11.03
[Design Pattern] Behavioral Pattern(행동 패턴) - 1  (1) 2024.11.02
[Design Pattern] Creational Pattern  (1) 2024.11.01
'ETC' 카테고리의 다른 글
  • [Design Pattern] Structural Pattern
  • [Design Pattern] Behavioral Pattern(행동 패턴) - 2
  • [Design Pattern] Behavioral Pattern(행동 패턴) - 1
  • [Design Pattern] Creational Pattern
mxruhxn
mxruhxn
소소하게 개발 공부 기록하기
    반응형
    250x250
  • mxruhxn
    maruhxn
    mxruhxn
  • 전체
    오늘
    어제
    • 분류 전체보기 (152)
      • Java (21)
      • Spring (6)
      • Database (13)
      • Operating Syste.. (1)
      • Computer Archit.. (0)
      • Network (24)
      • Data Structure (6)
      • Algorithm (11)
      • Data Infra (7)
      • DevOps (12)
      • ETC (27)
      • Project (21)
      • Book (1)
      • Look Back (1)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    mxruhxn
    [CS] 문자 인코딩(Character Encoding)
    상단으로

    티스토리툴바