About UTF-8, Base64
컴퓨터는 항상 비트를 다룬다 그리고 비트를 사용해 수와 같은 대상을 표현한다.
https://infondgndg91.blogspot.com/2023/02/about-binary-number.html
그렇다면 문자나 키보드에 있는 다른 기호는 어떻게 표현할까?
ASCII(American Standard Code for Information Interchange)
키보드에 있는 모든 기호를 7bit 를 할당했다. 예를 들어 65 는 대문자 A 66은 대문자 B를 표현한다. 아래 링크에서 확인할 수 있다.
위와 같이 글자를 출력하는 데 쓰이지 않고 장치를 제어하기 위해 쓰이는 control character 가 있다. 이 중 상당수는 통신 제어를 위한 문자다. ACK(수신확인) '메세지를 받았음' 이고, NAK(반수신확인)는 '메세지를 받지 못했음'을 의미한다.
유니코드(Unicode)
아스키는 영어를 표현하는 데 필요한 모든 문자를 포함하고 있어서 상당 기간 표준 역할을 했다. 초기 컴퓨터는 미국산 혹은 영국산이었기 때문이다. 컴퓨터가 널리 쓰이게 되면서, 이외의 언어를 지원해야 했다. 국제 표준화 기구인 ISO(International Standard Organization) 은 ISO-646, ISO-8859 를 도입했다. 기본적으로 아스키를 확장해 유럽 언어에 필요한 액센트 기호나 그 밖의 발음 구별 기호를 추가했다. 그리고 일본 산업 표준 위원회는 JIS(Japanese Industrial Standards) 일본 문자 표현을 위해서 JIS X 0201 을 만들었다. 또한 중국어, 아랍어, 한국어(KS C 5601) 등 표준도 생겼다.
이렇게 많은 표준이 존재한 이유는 비트가 지금보다 더 비쌌다. 그래서 최대한 문자를 7비트나 8비트에 욱여넣었다. 비트가격이 떨어지면서 유니코드라는 표준이 생겼다. 문자에 16비트 코드를 부여했다. 16비트면 지구상의 모든 문자를 담고도 여분이 있으리라 생각했다. 이 후 유니코드는 21비트까지 확장했다.
유니코드 변환 형식 8비트
컴퓨터는 7비트값을 처리하도록 설계되지 않았다. 그래서 8비트를 사용해 아스키 문자를 저장한다. 미국 컴퓨터과학자 켄 톰슨과 캐나다 프로그래머 롭 파이크가 만든 유니코드 변환 형식 8비트(UTF-8, Unicode Transformation Format-8 bit)라는 인코딩 방법이 하위 호환성과 효율성 때문에 가장 널리 쓰이고 있다. UTF-8은 모든 아스키 문자를 8비트로 표현하기 때문에 아스키 데이터를 인코딩할 때는 추가 공간이 필요하지 않다. 그리고 UTF-8은 아스키가 아닌 문자의 경우 아스키를 받아서 처리하는 프로그램이 깨지지 않는 방법으로 문자를 인코딩한다.
유니코드 A (0x0041)는 아래와 같이 16bit 이다.
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
아래와 같이 UTF-8 A(0x41) 8bit 로 변환한다.
0 1 0 0 0 0 0 1
유니코드 (0x03C0) 는 아래와 같이 16bit 이다.
0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
아래와 같이 UTF-8 (0xCF) (0x80)
1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0
Base64 인코딩
지금보다 컴퓨터 사이의 통신 속도가 훨씬 느렸던 과거에는 효율성이 정말 중요했다. Base64 인코딩은 3byte 데이터를 4문자로 표현한다. 3바티으 데이터의 24비트를 네 가지 6비트 덩어리로 나누고, 각 덩어리의 6비트값에 출력 가능한 문자를 할당해 표현한다.
012 라는 3바이트를 인코딩하면 MDEy 다.
012 아스키 코드에서 48 49 50 값이다 -> 001100|00 0011|0001 00|110010| -> 12|3|4|50 -> MDEy
원본 데이터길이가 3바이트의 배수라는 보장은 없다. 예를 들어, 2바이트 문자를 인코딩하면 패딩 문자 = 를 통해서 해결한다.
01 2바이트를 인코딩하면
48 49 -> 001100|00 0011|0001 -> MDE=
댓글
댓글 쓰기