Encoding 이란

raccoonback·2019년 8월 10일
0

Unicode

문자 집합은 초창기에 128 문자를 표현하는 ASCII 위주였다. 하지만, 점차 컴퓨터가 보급되며 여러 나라의 언어를 표현하기 위한 규약을 필요로 하게되었고, 이를 위해 Unicode가 등자하게 되었다. 유니코드는 U+XXX0 코드 포인트를 가지고 있으며 범위를 나타낸다. 즉, 유니코드는 문자와 코드가 1 : 1 매핑되어 있다고 생각할 수 있다.

UTF-8

UTF-8 은 유니코드를 표현하기 위한 방법으로 사용된다. 초기에는 ASCII를 이용만으로도 가능했으나, 점차 컴퓨터의 보급량이 증대하였고, 여러 국제화 작업이 필요하게 되었다. 그럼 UTF-8은 어느 범위까지 지원이 가능할까?

UTF-8이 문자를 매칭하는 방식을 살펴볼 필요가 있다.

UTF-8은 Universal Coded Character Set + Transformation Format – 8-bit 약자로 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. 즉, 가변길이라는 것이다. 또한, UTF-8 인코딩은 1byte를 사용하여 U+0000 ~ U+007F 범위에 있는 ASCII와 하위 호환성을 유지한다. 또한, UTF-8은 엔디안을 신경쓰지 않아도 되어 여러 기기에서도 동일하게 호환이 가능하다. 또한, UTF-8은 단일 인코딩이라는 장점을 가지고 있다. utf-16 인코딩은 수 많은 하위 방식이 존재하기 때문에, 디코딩시에는 utf-16의 어떤 하위 인코딩을 사용했는지 여부도 파악해야만 한다. 따라서, utf-8은 한가지 방식으로 크로스 플랫폼 호환성을 가진 장점이 있다는 것이다.

UTF-8 은 아래와 같은 구조를 가진다.

코드 범위UTF-8 표현설명
000000-00007F0xxxxxxxASCII와 동일한 범위
000080-0007FF110xxxxx 10xxxxxx첫 바이트는 110 또는 1110으로 시작하고, 나머지 바이트들은 10으로 시작함
000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF11110zzz 10zzxxxx 10xxxxxx 10xxxxxxUTF-16 서러게이트 쌍 영역 (yyyy = zzzzz - 1). UTF-8로 표시된 비트 패턴은 실제 코드 포인트와 동일하다.

예를 들어 보자.
𐄨 문자의 경우, U+10128 유니코드 값을 가지며, UTF-8 인코딩을 하게 되면 [0xF0, 0x90, 0x84, 0xA8] 으로 변경이 된다.

변형된 UTF-8

UTF-16

UTF-16은 UTF-8에 비해

Base64

Base64 인코딩은 원본 이진 데이터를 6bit씩 나누어 64 문자에 매칭시키는 방법으로 네트워크에서 안전한 데이터 전송을 위해 사용된다. 그럼 어떤 부분이 안전하지 않은 것일까?

참고

https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_10000~10FFF
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%EC%98%81%EC%97%AD
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4
https://namu.wiki/w/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
https://namu.wiki/w/%EB%AC%B8%EC%9E%90%20%EA%B9%A8%EC%A7%90
https://d2.naver.com/helloworld/76650
http://www.unicode.org/standard/WhatIsUnicode.html
https://home.unicode.org/basic-info/overview/
https://stackoverflow.com/questions/3866316/whats-the-difference-between-utf8-utf16-and-base64-in-terms-of-encoding
https://stackoverflow.com/questions/3538021/why-do-we-use-base64
https://stackoverflow.com/questions/3538021/why-do-we-use-base64/3538079#3538079

profile
한번도 실수하지 않은 사람은, 한번도 새로운 것을 시도하지 않은 사람이다.

0개의 댓글