문자열
2010년도 이후, 우리는 유니코드라고 불리우는 인코딩 방식이 통일된 시대를 살아가고 있다. 유니코드(Unicode)는 유니코드 협회(Unicode Consortium)가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준인데, 이 유니코드를 통해서 문자열을 다루는 것이 각 프로그래밍마다 다르기 때문에 먼저 기본적으로 다루는 방식에 대해 공부를 해야한다.
그렇다면, 먼저 유니코드가 어떤 것인지에 대해 정확히 짚어봐야 한다.
유니코드는 무엇일까?
유니코드(Unicode)는 유니코드 협회(Unicode Consortium)가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자를 다루기 위한 알고리즘 등을 포함하고 있다.
방식은 이렇다 숫자와 글자, 즉 키와 값이 1:1로 매핑된 형태로 코드를 짠 것이다.
전세계의 모든 문자를 담기에는 양이 한정적일 것이라 생각이 들겠지만, 유니코드는 대부분의 양을 감당할 만큼의 공간을 사용하고 있어서 웬만큼은 다 담겨있다. 특히 한자의 총 갯수가 10만여자가 될 것이라고 추정하는데, 모든 한자를 담고 있지 못하다는 것을 빼면 전세계 대부분의 문자가 전부 유니코드에 담겨있다고 봐도 될 것이다. 우리가 사용하는 한글의 경우에는 조합형을 위한 자모와, 완성형 한글이 모두 포함되어 있다.
유니코드가 탄생하기 이전에는, 같은 한글이 적힌 텍스트 파일이라도 표현하는 방법이 제각각이었다. 어떤 파일이 지원하지 않는 다른 인코딩 형식으로 저장되어 있는 경우에는 파일을 제대로 불러올 수 없었다. 기본적으로 유니코드의 목적은 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것이다.
인코딩(부호화)이란?
인코딩이란 어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것이다. 이 신호를 입력하는 인코딩과 문자를 해독하는 디코딩을 하기 위해서는 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 한다. 이렇게 인코딩과 디코딩의 기준을 문자열 세트 또는 문자셋(charset)이라고 한다. 이 문자셋의 국제 표준이 유니코드인 것이다.
ASCII 문자는 무엇일까?
영문 알파벳을 사용하는 대표적인 문자 인코딩으로 7 비트로 모든 영어 알파벳을 표현할 수 있다. 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자를 포함한다. 유니코드는 이 ASCII를 확장한 형태이다.
UTF-8과 UTF-16의 차이점은 무엇일까?
UTF-8과 UTF-16은 인코딩 방식의 차이를 의미한다. UTF-8은 Universal Coded Character Set + Transformation Format – 8-bit의 약자로, UTF- 뒤에 등장하는 숫자는 비트(bit)를 의미한다. UTF-8/UTF-16등의 인코딩은 U+로 시작되는 코드표가 존재하고, 이를 유니코드라고 말한다. UTF같은 인코딩은 같은 유니코드표를 가지고 다르게 표현하는 방법인 것이다.
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_C000~CFFF
유니코드 C000~CFFF - 위키백과, 우리 모두의 백과사전
이 문서 안에는 일부 컴퓨터·브라우저에서 표시할 수 없는 문자가 있습니다. 그러므로 유니코드 글꼴이 있는 환경에서 보시는 것이 좋습니다. 다음은 U+C000에서 U+CFFF 안의 유니코드 문자 목록이
ko.wikipedia.org
UTF-8 특징: 가변 길이 인코딩
UTF-8은 유니코드 한 문자를 나타내기 위해 1 byte(= 8 bits) 에서 4 bytes까지 사용한다.
UTF8의 구조
UTF-8은 자리수에 따라서 표현되는 문자가 달라진다. ASCII의 경우 1byte로 표시되고 라틴문자 그리스문자 등은 2byte로 표시되는데, 자리수에 따라 아래와 같이 표현이 된다. 한글은 3byte로 표시된다.
1byte 이진법 표현 : 0xxxxxxx(0x000000 ~ 0x00007F)
ASCII 영역에서 사용하는 영역과 동일하다.
숫자 1을 표현하게 되면 0000 0031로 나타내게 된다.
2byte 이진법 표현: 110xxxxx 10xxxxxx(0x000080 ~ 0x0007FF)
2Byte로 표현하는 경우 첫 byte는 110이 앞에 붙고 2번째 byte의 경우 10이 붙는다.
3byte 이진법 표현: 1110xxxx 10xxxxxx 10xxxxxx(0x000800 ~ 0x00FFFF)
3byte로 표현하는 경우 첫 byte는 1110, 2번째 Byte는 10, 3번째 Byte에는 10이 붙는다.
4byte 이진법 표현: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(0x010000 ~ 0x10FFFF)
4byte로 표현하는 경우 첫 byte는 11110, 2번째는 10, 3번째는 10, 4번째는 10이 붙는다.
예시를 든 설명
예를 들어, "코" 라는 문자의 유니코드는 U+CF54 (16진수, HEX)로 표현된다. 이 문자를 이진법(binary number)으로 표시하면, 1100-1111-0101-0100 이 된다. 이 문자를 UTF-8로 표현하면, 다음과 같이 3byte 의 결과로 표현할 수 있다.
먼저 CF54를 이진수로 변경해준다.
16진수: C F 5 4
2진수: 1100 1111 0101 0100
왜 3바이트지? 한글은 기본적으로 3byte부터 시작되는 것으로 약속되어 있다.
x 안에 이진법으로 표시한 CF54가 x안에 순서대로 들어가게 되는 것이다.
1110xxxx 10xxxxxx 10xxxxxx
11101100 10111101 10010100
[데이터] UTF-8로 표현된 '코'
이처럼, UTF-8은 1 byte에서 4 bytes까지의 가변 길이를 가지는 인코딩 방식이다. 네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩된다. 사용된 문자에 따라 더 작은 크기의 문자열을 표현할 수 있기 때문이다. ASCII 문자는 1 바이트만으로 표현 가능한 것처럼 말이다. UTF-8은 ASCII 코드의 경우 1 byte, 크게 영어 외 글자는 2byte, 3byte, 보조 글자는 4byte를 차지한다. 이모지는 보조 글자에 해당하기 때문에 4byte가 필요하다.
UTF-8 특징: 바이트 순서가 고정됨
UTF-16에 비해 바이트 순서를 따지지 않고, 순서가 정해져 있다.
UTF-16 특징: 코드 그대로 바이트로 표현 가능, 바이트 순서가 다양함
UTF-16은 유니코드 코드 대부분(U+0000부터 U+FFFF; BMP) 을 16 bits로 표현한다.
- 대부분에 속하지 않는 기타문자는 32 bit(4 bytes)로 표현하므로 UTF-16도 가변 길이라고 할 수 있으나, 대부분은 2 바이트로 표현한다
U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101 이다. 이 이진법으로 표현된 문자를 16 bits(2 bytes)로 그대로 사용하며, 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라질 수 있다. UTF-8에서는 한글은 3 바이트, UTF-16에서는 2 바이트를 차지한다.
'개발 R.I.P.' 카테고리의 다른 글
9.13 Dev.Feedback (컴퓨터공학 기초 #3 운영체제) (0) | 2021.09.13 |
---|---|
9.12 Dev.Feedback (컴퓨터공학 기초 #2 그래픽) (0) | 2021.09.12 |
9.09 Dev.Feedback (OAuth 2.0) (0) | 2021.09.09 |
9.08 Dev.Feedback (Cookie) (0) | 2021.09.08 |
9.07 Dev.Feedback (토큰 기반 인증) (0) | 2021.09.07 |