-
UTF-8과 UTF-16이란?카테고리 없음 2019. 6. 21. 09:06
지난번에 유니코드에 관련된 포스팅에 이어서 이번에는 대표적인 유니코드 인코딩 방법인 UTF-8과 UTF-16에 대해서 알아보겠습니다
다들 프로그래밍을 개발하시면서 UTF-8, UTF-16에 대한 내용을 많이 봤을 거라고 생각이 듭니다
그렇다면 이렇게 많이 사용하는 UTF-8이란 무엇일까요?
지난번에 말씀드렸다 싶이 유니코드는 ASCII처럼 문자들의 코드표입니다
UTF-8이란 유니코드의 값을 인코딩하는 방식 중 하나일 뿐입니다 (물론 UTF-16 또한 마찬가지)
그렇다면 어떻게 동작하는지 알아보면
위의 이미지에 대한 동작 방식을 알면 됩니다!!! (간단하죠?)
UTF-8은 가변 길이 방식의 인코딩 방법입니다
가변 길이라는게 어떤 말이냐 하면 인코딩 된 값이 1~4 byte의 값을 동적으로 얻는다는 말입니다
그런데 여기서 뭔가 눈치를 채신 분들이 계실지도 모르지만 code point에 7의 부분을 보시면 익숙한 느낌이 들지 않나요?
그렇죠 기존에 ASCII에서 사용하던 값의 범위입니다 (BMP)
UTF-8에서도 ASCII에 사용되는 값은 똑같이 1byte로 적용된다는 걸 알 수가 있습니다
그렇다면 저 뒤에 보이는 Byte 1,2,3,4는 어떤 걸 의미하는 걸까요?
여기가 UTF-8의 표현 규칙인데 "a"를 가지고 한번 예시를 들어보면
a의 unicode 값은 U+0061입니다
16진수 0061을 2진수로 표현하면 1100001의 값이 됩니다
여기서 2진수 bit 수는 7개로 즉 위에 표를 보면 맨 위의 타입이 됩니다
여기서 Byte1을 보면 0 xxxxxxx 이렇게 되어있는데 x에 나온 2진수 값을 대입해주면 되는 겁니다
01100001이 UTF-8에서의 a를 표현하는 방식인 거죠
이처럼 해당하는 unicode표에 있는 값을 2진 수화해서 bit 수에 맞는 타입을 찾은 뒤 규칙에 맞게 대입하는 방식이 UTF-8의 특징입니다
그렇다면 UTF-16에 대해서도 알아보도록 하죠
UTF-8은 가변 길이 인코딩 방식이라고 했던 말 기억나시나요?
UTF-16은 2byte 혹은 4byte로만 이루어집니다
기본적으로 UTF-16에서는 유니코드 표에 나오는 모든 값은 그 값을 그대로 사용합니다
예시로 '발'이라는 유니코드 표에서 값을 찾으면 U+BC54입니다
그 값을 그대로 2진수로 변경하면 1011 1100 0101 0100 이렇게 2진수가 나오는데 이 값을 그대로 사용합니다
위와 같이 모든 유니코드에 나오는 값들을 표현이 가능한데 왜 4byte 얘기가 나왔냐
그 이야기는 조금 깊숙이 들어가 봐야 합니다
16비트로 표현이 불가능한 글자들을 처리하기 위해서 고안되고 만들어진 것입니다
전에 봤던 유니코드 표를 참조하면 UTF-16 상하위 영역이 보이실 겁니다
(안보이신다면 https://dayzen1258.tistory.com/entry/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%84%EC%8B%9C%EB%82%98%EC%9A%94 여기로 확인을!!!)
UTF-16은 서러게이트라는 특별한 값을 가지고 있는데 이는 유니코드 표에서 보셨다시피 UTF-16 전용으로 존재하는 코드표입니다 (그렇기에 서러게이트에 포함하는 값에는 따로 문자가 지정되지 않기에 UTF-16에서 규칙으로 선정이 가능합니다)
상위 서러게이트 1101 10xx xxxx xxxx, 하위 서러게이트는 1101 11xx xxxx xxxx 이런 식으로 값이 처리가 되는 모종의 규칙이 존재합니다
이젠 어느정도 UTF-8과 UTF-16이 어떻게 인코딩 되는지 느낌이 오셨나요??
오셨으면 충분한 성공이고 안 오셨더라도 충분히 도움되는 지식을 얻으셨을 거라고 생각이 듭니다
각 인코딩 방법마다 각각의 특징이 있듯이
(UTF-8과는 다르게 BMP에 나오는 모든 단어는 UTF-16에서는 2byte로 고정되기에 UTF-8에서는 한글이 3byte라면 UTF-16에서는 2byte 반대로 UTF-8에서 ASCII값들은 1byte로 표현되는 반면에 UTF-16에서는 무조건 2byte로 처리)
여러분들도 자신의 프로젝트에 맞는 인코딩 방법 잘 선택하셔서 처리하기를 바라겠습니다 :)