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=


댓글

이 블로그의 인기 게시물

About JVM Warm up

About idempotent

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

대학생 코딩 과제 대행 java, python, oracle 네 번째