유니코드와 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로 인코딩된 데이터를 읽을 때, 몇 바이트까지 읽어야 할지 결정하는 방법은 다음과 같습니다:

  1. 첫 바이트 읽기: 인코딩된 데이터에서 첫 바이트를 확인합니다.
  2. 비트 패턴 분석: 첫 바이트의 비트 패턴을 분석하여 몇 바이트를 읽어야 하는지 판단합니다.
    • 0xxxxxxx -> 1바이트
    • 110xxxxx -> 2바이트
    • 1110xxxx -> 3바이트
    • 11110xxx -> 4바이트
  3. 해당 바이트 수만큼 읽기: 분석된 바이트 수만큼 데이터를 읽어 유니코드 문자를 복원합니다.

문자 ‘A’

  • 유니코드 코드 포인트: U+0041
  • UTF-8 인코딩: 0x41 (1바이트)

문자 ‘가’

  • 유니코드 코드 포인트: U+AC00
  • UTF-8 인코딩: 0xEA 0xB0 0x80 (3바이트)

이모지 ‘😀’

  • 유니코드 코드 포인트: U+1F600
  • UTF-8 인코딩: 0xF0 0x9F 0x98 0x80 (4바이트)

네트워크 전송 과정

  1. 인코딩:
    • 애플리케이션에서 데이터를 UTF-8 등으로 인코딩합니다.
  2. 패킷화:
    • 데이터는 네트워크 프로토콜(예: TCP/IP)에 따라 패킷으로 나누어집니다.
  3. 전송:
    • 각 패킷은 네트워크를 통해 바이트 단위로 전송됩니다.
  4. 패킷 재조립:
    • 수신 측에서 전송된 패킷들을 다시 순서대로 재조립합니다. 손실되거나 오류가 발생한 패킷은 재전송 요청을 통해 보완되며, 모든 패킷이 올바르게 도착하면 데이터가 완전하게 복구됩니다.
  5. 복호화:
    • 재조립된 데이터는 원래의 바이트 시퀀스로 복원된 후, UTF-8 인코딩을 해제하여 원래의 문자 데이터를 복원합니다. 이를 통해 송신자가 전송한 데이터를 수신자가 정확하게 재구성할 수 있습니다.
  6. 데이터 처리:
    • 복호화된 데이터는 수신 애플리케이션에서 처리되며, 사용자에게 표시되거나 추가적인 작업에 사용됩니다.

이 과정을 통해 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

수신 측에서는 이 바이트 시퀀스를 받으면, 각 바이트를 순서대로 읽으며 디코딩합니다.

  1. 첫 바이트 0x48 읽기:
    • 첫 바이트의 비트 패턴이 0xxxxxxx이므로, 이는 1바이트로 인코딩된 문자임을 나타냅니다.
    • 0x48을 디코딩하면 문자 ‘H’가 복원됩니다.
  2. 두 번째 바이트 0x65 읽기:
    • 두 번째 바이트의 비트 패턴도 0xxxxxxx이므로, 역시 1바이트로 인코딩된 문자입니다.
    • 0x65를 디코딩하면 문자 ‘e’가 복원됩니다.
  3. 세 번째와 네 번째 바이트 0x6C 읽기:
    • 세 번째와 네 번째 바이트 모두 0xxxxxxx 패턴이므로, 각 바이트는 1바이트로 인코딩된 문자입니다.
    • 각각의 0x6C를 디코딩하면 문자 ‘l’이 복원됩니다.
  4. 다섯 번째 바이트 0x6F 읽기:
    • 다섯 번째 바이트도 0xxxxxxx 패턴입니다.
    • 0x6F를 디코딩하면 문자 ‘o’가 복원됩니다.

최종 복원된 문자열

수신 측에서 이 과정을 통해 “Hello”라는 원래의 문자열이 정확하게 복원됩니다.


© 2021. All rights reserved.

Powered by Hydejack v9.2.1