유니코드
전 세계 사용자를 대상으로 동일한 규칙으로 모든 언어를 표현할 수 있는 유니코드 문자 집합을 국제 표준화 기구(ISO)에서 만들었습니다.
최초 버전 1.0은 1991년에 만들어지고 이후 꾸준하게 언어들이 추가되면서 12.1버전까지 만들어졌습니다.
유니코드 문자 집합을 표현하는 문자열 인코딩은
- UTF-8
- UTF-16
- UTF-32
총 세 가지가 존재합니다.
UTF-8
UTF-8은 8비트(1BYTE)로 인코딩한다는 것을 의미합니다.
*인코딩 : 사람의 언어를 컴퓨터가 인지할 수 있는 0, 1로 변환 디코딩은 반대개념
UTF-8은 아스키코드와 완벽하게 호환되며 표현하려는 문자에 따라 최소 1바이트에서 최대 6바이트까지 사용합니다.
두번째 줄 110XXXXX. 10XXXXXX을 통하여 110 과 10은 고정된 비트 값이며 'X'문자가 유니코드를 저장하는데 사용되는 비트 영역입니다.
두번째 줄은 x가 총 11개로 11개의 비트로 UTF-8 문자를 만들 수 있습니다.
'안'을 구성하는 16진수 값은 0xec, 0x95, 0x88입니다.
이 3개의 값을 2진수로 표현시 1110'1100 1001'0101 1000'1000이며
3바이트이므로 1110'1100 1001'0101 1000'1000 으로 1100, 010101, 001000을 읽어서 다시 한번 조합하면
1100'0101'0100'1000 을 얻어낼 수 있습니다.
이것을 다시 16진수로 변환하면 0xC548을 얻게 되고
이 0xC548은 유니코드에서 정의한 규칙에 따라 문자 '안'을 구성하게 됩니다.
UTF-16
UTF-16은 16비트(2BYTE)로 인코딩하는 것을 의미합니다.
UTF-16은 2byte, 4byte만 사용하기 때문에 아스키 코드와 호환되지 않습니다.
- 기본 다국어 평면(BMP)
- 보충 다국어 평면(SMP)
- 상형 문자 보충 평면(SIP)
- 특수 목적 보충 평면(SSP)
등 평면 4개가 있고, 바이트 수는 표현하려는 문자가 어떤 평면에 속하는지에 따라 결정됩니다.
일반 글자는 2byte로 사용하지만 이를 벗어나는 특수 문자들을 4byte로 표현하게 됩니다.
0xff와 0xfe는 바이트 순서 표기 방법으로 리틀엔디안과 빅엔디안의 차이로 추가가 되며
utf-8은 1byte씩 변환하기 때문에 바이트 순서 표시(BOM)을 사용하지 않습니다.
리틀 엔디언 방식은 0xff 다음 0xfe을 읽고 빅 엔디언은 반대로 0xfe를 읽은 후 0xff를 읽습니다.
다음은 0xff가 먼저 왔으므로 리틀 엔디언 방식으로 뒤부터 읽어 0xc5, 0x48을 읽어
0xc548 값이 되며 이 값은 '안'입니다.
최종적으로 정리를 하게되면
- UTF-8
- 오늘날 가장 많이 사용하는 문자열 인코딩방법, 최소 1바이트, 최대 6바이트
- 아스키 코드와 호환 가능
- 윈도우, 자바, 임베디드를 제외한 거의 모든 환경에서의 문자열 처리 표준
- JSON은 UTF-8 인코딩만 사용
- UTF-16
- 2바이트 또는 4바이트 길이의 문자열을 사용하며, 아스키 코드와 호환X
- UTF-16 기반 환경에서 UTF-8을 사용할 때는 사용 영역을 명확히 구분하는게 좋음
- UTF-32
- 4바이트를 고정적으로 사용
도움된 페이지
https://en.wikipedia.org/wiki/UTF-8
https://en.wikipedia.org/wiki/UTF-16
https://ko.rakko.tools/tools/89/
학교에서 알려주지 않는 17가지 실무 개발 기술