유니코드와 UTF-8 란?
‘유니코드와 UTF-8’
유니코드와 UTF-8에 대해서 간략하게 정리해봤습니다.
유니코드와 UTF-8 정의
- 유니코드(Unicode): 전 세계의 모든 문자에 대해 고유한 코드를 할당하는 표준입니다. 예를 들어, ‘A’는 U+0041, ‘가’는 U+AC00입니다.
- UTF-8: 유니코드 코드 포인트를 1바이트에서 4바이트까지 가변 길이의 바이트 시퀀스로 인코딩하는 방식입니다. 예를 들어, ‘A’는 0x41로 1바이트를 차지하고, ‘가’는 0xEA 0xB0 0x80로 3바이트를 차지합니다.
한글이 UTF-8에서 차지하는 바이트 수
한글 문자 하나는 UTF-8 인코딩에서 3바이트를 차지합니다.
예를 들어, ‘가’는 U+AC00으로 표현되며, 이를 UTF-8로 인코딩하면 0xEA 0xB0 0x80로 나타납니다.
이는 각각 1바이트씩 3바이트를 사용하여 한글 문자를 표현합니다. UTF-8은 아스키 문자와 호환성을 유지하면서도, 비아스키 문자를 효율적으로 인코딩할 수 있는 방식입니다.
0x의 의미
0x는 숫자 앞에 붙여서 해당 숫자가 16진수임을 나타내는 접두사입니다.
16진수는 0-9와 A-F를 사용하여 숫자를 표현하며, 이는 2진수와 8진수와 함께 컴퓨터 시스템에서 일반적으로 사용됩니다.
예를 들어, 10은 16진수로 0xA, 15는 0xF, 16은 0x10입니다.
UTF-8 인코딩 분석
문자를 UTF-8로 인코딩된 데이터를 읽을 때, 몇 바이트까지 읽어야 할지 결정하는 방법은 다음과 같습니다:
- 첫 바이트 읽기: 인코딩된 데이터에서 첫 바이트를 확인합니다.
- 비트 패턴 분석: 첫 바이트의 비트 패턴을 분석하여 몇 바이트를 읽어야 하는지 판단합니다.
- 0xxxxxxx -> 1바이트
- 110xxxxx -> 2바이트
- 1110xxxx -> 3바이트
- 11110xxx -> 4바이트
- 해당 바이트 수만큼 읽기: 분석된 바이트 수만큼 데이터를 읽어 유니코드 문자를 복원합니다.
문자 ‘A’
- 유니코드 코드 포인트: U+0041
- UTF-8 인코딩: 0x41 (1바이트)
문자 ‘가’
- 유니코드 코드 포인트: U+AC00
- UTF-8 인코딩: 0xEA 0xB0 0x80 (3바이트)
이모지 ‘😀’
- 유니코드 코드 포인트: U+1F600
- UTF-8 인코딩: 0xF0 0x9F 0x98 0x80 (4바이트)
네트워크 전송 과정
- 인코딩:
- 애플리케이션에서 데이터를 UTF-8 등으로 인코딩합니다.
- 패킷화:
- 데이터는 네트워크 프로토콜(예: TCP/IP)에 따라 패킷으로 나누어집니다.
- 전송:
- 각 패킷은 네트워크를 통해 바이트 단위로 전송됩니다.
- 패킷 재조립:
- 수신 측에서 전송된 패킷들을 다시 순서대로 재조립합니다. 손실되거나 오류가 발생한 패킷은 재전송 요청을 통해 보완되며, 모든 패킷이 올바르게 도착하면 데이터가 완전하게 복구됩니다.
- 복호화:
- 재조립된 데이터는 원래의 바이트 시퀀스로 복원된 후, UTF-8 인코딩을 해제하여 원래의 문자 데이터를 복원합니다. 이를 통해 송신자가 전송한 데이터를 수신자가 정확하게 재구성할 수 있습니다.
- 데이터 처리:
- 복호화된 데이터는 수신 애플리케이션에서 처리되며, 사용자에게 표시되거나 추가적인 작업에 사용됩니다.
이 과정을 통해 UTF-8로 인코딩된 데이터를 안전하게 전송하고, 원본 데이터를 정확하게 복원할 수 있습니다.
예시
예를 들어, 문자열 “Hello”를 네트워크를 통해 전송한다고 가정해 봅시다.
- 문자 ‘H’의 유니코드 코드 포인트: U+0048
UTF-8 인코딩: 0x48 (1바이트)
- 문자 ‘e’의 유니코드 코드 포인트: U+0065
UTF-8 인코딩: 0x65 (1바이트)
- 문자 ‘l’의 유니코드 코드 포인트: U+006C
UTF-8 인코딩: 0x6C (1바이트)
- 문자 ‘o’의 유니코드 코드 포인트: U+006F
- UTF-8 인코딩: 0x6F (1바이트)
“Hello”는 UTF-8로 인코딩되었을 때 [0x48, 0x65, 0x6C, 0x6C, 0x6F] 바이트 시퀀스로 표현됩니다.
네트워크를 통해 전송될 때, 이 데이터는 다음과 같이 바이트 단위로 전송됩니다.
01001000 01100101 01101100 01101100 01101111
수신 측에서는 이 바이트 시퀀스를 받으면, 각 바이트를 순서대로 읽으며 디코딩합니다.
- 첫 바이트 0x48 읽기:
- 첫 바이트의 비트 패턴이 0xxxxxxx이므로, 이는 1바이트로 인코딩된 문자임을 나타냅니다.
- 0x48을 디코딩하면 문자 ‘H’가 복원됩니다.
- 두 번째 바이트 0x65 읽기:
- 두 번째 바이트의 비트 패턴도 0xxxxxxx이므로, 역시 1바이트로 인코딩된 문자입니다.
- 0x65를 디코딩하면 문자 ‘e’가 복원됩니다.
- 세 번째와 네 번째 바이트 0x6C 읽기:
- 세 번째와 네 번째 바이트 모두 0xxxxxxx 패턴이므로, 각 바이트는 1바이트로 인코딩된 문자입니다.
- 각각의 0x6C를 디코딩하면 문자 ‘l’이 복원됩니다.
- 다섯 번째 바이트 0x6F 읽기:
- 다섯 번째 바이트도 0xxxxxxx 패턴입니다.
- 0x6F를 디코딩하면 문자 ‘o’가 복원됩니다.
최종 복원된 문자열
수신 측에서 이 과정을 통해 “Hello”라는 원래의 문자열이 정확하게 복원됩니다.