[CS] ASCII 코드

Jae ·2021년 11월 26일
0

Computer Science

목록 보기
1/5

컴퓨터는 문자를 어떻게 표현할까?


ASCII 코드

컴퓨터를 다루는 세상에서 수년에 걸쳐 숫자를 알파벳 문자에 대응시키는 표준을 채택했는데, 이것이 바로 ASCII 코드다. 글자를 10진수로 대응하는 표이다.

우리가 사용하는 프로그램, 웹 브라우저, 이메일 같은 것에서 쓰이는 문자들이 ASCII 코드의 표준 방식을 통해 bit 패턴들로 쉽게 변환될 수 있는 것이다.

  • 컴퓨터는 문자를 비롯한 다양한 형태의 정보를 저장한다. 하지만 컴퓨터는 0과 1로된 데이터만 저장할 수 있기 때문에, 0과 1만을 이용해서 문자로 나타내야 한다.
  • ASCII 코드문자를 컴퓨터가 이해할 수 있는 이진 데이터(0 or 1)로 변환하는 표준 방법이다.

영문 알파벳을 사용하는 대표적인 문자 인코딩으로 7 비트모든 영어 알파벳을 표현할 수 있다. 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자를 포함한다.

ASCII 코드의 한계

  • ASCII 코드는 ASCII 코드 표로 나타낸다. ASCII 코드 표는 모든 ASCII 문자와 그에 대응하는 숫자를 보여준다.
  • 기본 ASCII 코드
    7bit만 이용해서 모든 문자를 나타내는데, 이것은 ASCII 코드로 2의 7제곱, 즉 128개의 문자를 나타낼 수 있다는 것을 의미한다.
  • 확장 ASCII 코드
    8번째 비트를 추가 해서 256개 문자를 나타낼 수 있다. 소문자와 대문자 통틀어 52개의 알파벳이 존재하고, 그 외 남는 공간에 구분 기호, 숫자, 기타 기본 심볼($, %, & 기호 등) 같은 다른 종류의 문자들을 나타낼 수 있다.
  • 하지만 우리가 사용할 수 있는 문자들의 개수는 256개보다 많기 때문에, 8비트 ASCII 코드로도 나타낼 수 없는 문자들이 아직도 많이 있다. (e.g. 수학 기호, 영어 외 다른 언어 글자)
  • 이 때문에 훨씬 더 많은 문자들을 포함할 수 있는 유니코드(Unicode) 가 생기게 됐다.
  • 유니코드는 100만개 이상의 문자들을 나타낼 수 있는 문자 인코딩 표준이다. 유니코드의 첫 128개의 문자는 ASCII의 128개의 문자와 동일하므로 서로 호환 가능하다.

유니코드


유니코드(Unicode)는 유니코드 협회(Unicode Consortium)가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자를 다루기 위한 알고리즘 등을 포함하고 있다.

유니코드가 탄생하기 이전에는, 같은 한글이 적힌 텍스트 파일이라도 표현하는 방법이 제각각이었는데, 어떤 파일이 지원하지 않는 다른 인코딩 형식으로 저장되어 있는 경우에는 파일을 제대로 불러올 수 없었다. 기본적으로 유니코드의 목적은 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이다.

  • 유니코드는 ASCII를 확장한 형태다.

Encoding(부호화)


  • 인코딩이란 어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것
  • 신호를 입력하는 인코딩과 문자를 해독하는 디코딩을 하기 위해서는 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 한다.
  • 이렇게 인코딩과 디코딩의 기준문자열 세트 또는 문자셋(charset) 이라고 한다.
  • 문자셋의 국제 표준이 유니코드다.

인코딩 방식


UTF-8 vs UTF-16

UTF-8과 UTF-16은 인코딩 방식의 차이를 의미한다.

UTF-8은 Universal Coded Character Set + Transformation Format – 8-bit의 약자로, UTF- 뒤에 등장하는 숫자는 비트(bit)이다.

1. UTF-8 특징: 가변 길이 인코딩

UTF-8은 유니코드 한 문자를 나타내기 위해 1 byte(=8 bits)에서 4 bytes까지 사용한다.

  • 원리
    예를 들어, 라는 문자의 유니코드는 U+CF54 (16진수, HEX)로 표현된다. 이 문자를 이진법(binary number)으로 표시하면, 1100-1111-0101-0100 이 된다. 이 문자를 UTF-8로 표현하면, 다음과 같이 3byte의 결과로 표현된다.

  • UTF-8로 표현된 '코'

1110xxxx 10xxxxxx 10xxxxxx # x 안에 순서대로 값을 채워넣는다.
11101100 10111101 10010100
  • '코'라는 문자를 UTF-8로 표현할 수 있다.
let encoder = new TextEncoder(); // 기본 인코딩은 'utf-8'
encoder().encode('코') // Uint8Array(3) [236, 189, 148]

(236).toString(2) // "11101110"
(189).toString(2) // "10111101"
(148).toString(2) // "10010100"

ASCII 코드는 7bit로 표현되고, UTF-8에서는 다음과 같이 1byte의 결과로 만들 수 있다. 다음 예제는 b 라는 문자를 UTF-8로 인코딩한 결과다.

  • UTF-8로 표현된 'b'
    0xxxxxxx 01100010

  • 'b'라는 문자를 UTF-8로 표현할 수 있다.
    js encoder.encode('b') // Uint8Array [98] (98).toString(2) // "1100010"

이처럼, UTF-8은 1 byte에서 4 bytes까지 가변 길이를 가지는 인코딩 방식이다. 네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩 된다. 사용된 문자에 따라 더 작은 크기의 문자열을 표현할 수 있기 때문이다. ASCII 문자는 1 byte 만으로 표현 가능한 것처럼 말이다.

UTF-8ASCII 코드의 경우 1 byte, 크게 영어 외 글자는 2byte, 3byte, 보조 글자는 4byte를 차지한다. 이모지는 보조 글자에 해당하기 때문에 4byte가 필요하다.

2. UTF-8 특징: 바이트 순서가 고정됨

  • UTF-16에 비해 바이트 순서를 따지지 않고, 순서가 정해져 있다.
  • UTF-8에서 한글은 3 bytes

3. UTF-16 특징: 코드 그대로 바이트로 표현, 바이트 순서가 다

  • 코드 그대로 바이트 표현 가능

  • 바이트 순서가 다양하다.

  • UTF-16은 유니코드 코드의 대부분 (U+0000부터 U+FFFF; BMP)을 16 bits로 표현한다.

    • 대부분에 속하지 않는 기타 문자는 32 bits(4 bytes)로 표현하므로 UTF-16도 가변 길이라고 할 수 있으나, 대부분은 16 bits(2 bytes)로 표현한다.
    • 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라진다.
  • UTF-16에서 한글은 2 bytes를 차지

0개의 댓글