본문 바로가기
기타

ASCII, Unicode

by ㅇㅅㅇ.. 2024. 8. 10.
Blind SQL Injection 실습을 하다가 한글의 한 글자가 24비트로 표현되는 이유를 몰라서 알아보게 되었다.

 

ASCII (American Standard Code for Information Interchange)

알파벳을 사용하는 대표적인 문자 인코딩으로 대부분의 문자 인코딩의 기초가 됨

  • 7비트 인코딩
    = 2^7 =  범위: 0~127 = 128가지 = 16진수 두 자리로 표현 가능

  • [ 0~32 ]: 출력 불가능한 제어 및 공백 문자
    [ 33~127 ]: 출력 가능한 문자, 숫자, 알파벳


Unicode

알파벳뿐만 아니라 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현할 수 있도록 만든 표준코드
유니코드는 글자와 코드가 1:1로 매핑되어 있는 '코드표'이고 UTF-8이 유니코드를 '인코딩'하는 방식이라 할 수 있다.

 

유니코드는 연속된 코드 포인트들과 그들의 집한인 block으로 구성되어 있다. 한 영역은 16의 배수로 U+nnn0와 같이 나타낼 수 있으며 유니코드 8.0 기준 262개의 영역이 있다. 각 영역은 다른 영역과 겹치지 않으며 한글의 경우 U+AC00 영역부터 U+D7AF 영역을 사용한다. 10진수로 바꾸면 44032~55215 이므로 총 11,184개의 공간을 사용한다고 할 수 있다. 

차례대로 영역범위, 이름, 코드 포인트, 할당된 글자, 문자

 

11,184개의 코드 포인트 중 아래 표처럼 AC00을 시작으로 초성 19개 x 중성 21개 x 종성이 28개 = 모두 11,172개의 문자가 저장되어 있고 12개의 코드 포인트는 비어있는 것을 확인할 수 있다. 실제로 쓰이지 않는 조합까지 모두 포함하고 있기에 다른 언어에 비해 많은 공간을 차지하고 있다. 

 


UTF-8

유니코드를 위한 가변 길이 인코딩 방식으로 1byte에서 최대 4byte까지 사용한다.

  • 예를  들어 U+0000 ~ U+007F 범위에 있는 ASCII 문자들은 1byte로 표현할 수 있다.
  • 한글의 경우 U+AC00 ~ U+D7AF로 실제로는 2byte로 표현이 가능하지만 유니코드 설계상 3byte로 인코딩한다.

인코딩 규칙

출처: 나무위키 UTF-8

한글은 3byte를 사용하므로 첫 번째 바이트의 상위 4비트1110을 넣어야 한다.

두 번째 바이트세 번째 바이트상위 2비트엔 다른 바이트와 연결 됐음을 알려주는 용도로 10을 넣어야 한다.

나머지 남는 비트에 차례대로 16개의 데이터 비트를 넣는다. 


관련 함수

유니코드 글자 하나를 숫자(10진수)로 반환해주는 함수
유니코드의 1~127은 ASCII 와 동일
바로 위의 나무위키 예시를 보면 한글의 '한'은 유니코드로 0xD55C 이를 10진수로 변환하면 54620

'기타' 카테고리의 다른 글

Big-endian / Little-endian  (0) 2024.08.10