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로 인코딩한다.
인코딩 규칙
한글은 3byte를 사용하므로 첫 번째 바이트의 상위 4비트에 1110을 넣어야 한다.
두 번째 바이트와 세 번째 바이트의 상위 2비트엔 다른 바이트와 연결 됐음을 알려주는 용도로 10을 넣어야 한다.
나머지 남는 비트에 차례대로 16개의 데이터 비트를 넣는다.
관련 함수
'기타' 카테고리의 다른 글
Big-endian / Little-endian (0) | 2024.08.10 |
---|