JAVA

유니코드와 UTF-8

경딩 2024. 11. 17. 22:49
  • 유니코드는 문자표, 테이블이다. (이 글자를 bit 로 표현하면 어떤 bit 로 표현된다는 테이블 - 변환표)
  • utf-8 은 그 표를 가지고 문자열을 어떻게 압축해서 표현할것인지
  • 유니코드는 글자와 코드가 1:1매핑 되어 있는 ‘코드표'이다. (코드표)
  • UTF-8은 유니코드를 인코딩(encoding) 하는 방식이다. 전 세계에서 사용하는 약속이다.

문자열을 비트로 표현하면 어떤 비트로 표현될 것이다라는 테이블 변환 표이고

UTF- 8 은 유니 코드를 어떻게 변환할 것인가에 대한 스팩이다.

UTF-8이란 말은 Unicode Transformation Format - 8bit에서 유래했다.

 

  • 문자 인코딩 :  문자 집합을 통해 문자를 숫자로 변환하는 것
  • 문자 디코딩: 문자 집합을 통해 숫자를 문자로 변환하는 것

인코딩 = 데이터를 특정 규칙에 따라 다른 형태포 변환하는 과정

목적: 저장 , 전송, 해석이 가능하도록 만드는 것

 

예시 

① 문자열 → 바이너리

  • 문자열 "A"를 컴퓨터에 저장하려면 0과 1로 변환해야 함
  • ASCII 인코딩: "A" → 65 → 01000001 (8비트)
  • UTF-8 인코딩: "가" → 1110 1010 1000 0001 1010 0101 (3바이트)

② 숫자 → 바이너리

  • 정수 5 → 32비트 정수 표현: 00000000 00000000 00000000 00000101
  • 부동소수점 0.3 → IEEE 754 표준에 따라 근사치로 32비트 표현

③ 데이터 전송

  • 텍스트 데이터를 HTTP로 전송 → UTF-8로 인코딩 후 전송
  • 이미지 파일을 Base64로 인코딩 → 텍스트로 안전하게 전송 가능

핵심 포인트

  • 인코딩은 단순히 “0과 1로 변환”하는 것뿐 아니라
    • 규칙을 정의하고,
    • 해석 가능하게 만드는 과정까지 포함
  • 즉, 같은 값이라도 인코딩 방식에 따라 바이너리 표현이 달라질 수 있음
package org.example;

import java.nio.charset.Charset;
import java.util.Arrays;

import static java.nio.charset.StandardCharsets.*;

public class EncodingMain {
    public static void main(String[] args) {
        System.out.println("영문 처리");
        encoding("A", US_ASCII);
        encoding("A", UTF_8);
        encoding("A", UTF_16BE);

        System.out.println("한글 처리");
        encoding("가", US_ASCII);
        encoding("가", UTF_8);
        encoding("가", Charset.forName("EUC-KR"));

    }

    private static void encoding(String text, Charset charset){
        byte[] bytes = text.getBytes(charset);
        System.out.printf("%s -> [%s] 인코딩 -> %s %s byte\n", text, charset, Arrays.toString(bytes), bytes.length);
    }
}

 

  • 문자를 컴퓨터가 이해할 수 있는 숫자 (byte) 로 변경하는 것을 문자 인코딩이라 한다.
  • String.getByte(Charset) 메서드를 사용하면 String 문자를 byte 배열로 변경할 수 있다.
  • 이때 중요한 점이 있는데 문자를 byte 로 변경하려면 문자 집합이 필요하다는 점이다.  따라서 어떤 문자 집합을 참고해서 byte 로 변경할지 정해야한다. String.getByte() 인자로 Charset 객체를 전달하면 된다.
    • 문자 집합을 지정하지 않으면 현재 시스템에세서 사용하는 기본 문자 집합을 인코딩한다.
영문 처리
A -> [US-ASCII] 인코딩 -> [65] 1 byte
A -> [UTF-8] 인코딩 -> [65] 1 byte
A -> [UTF-16BE] 인코딩 -> [0, 65] 2 byte
한글 처리
가 -> [US-ASCII] 인코딩 -> [63] 1 byte
가 -> [UTF-8] 인코딩 -> [-22, -80, -128] 3 byte
가 -> [EUC-KR] 인코딩 -> [-80, -95] 2 byte
  • US-ASCII , UTF-8 은 모두 ASCII 와 호환된다.
    • 영문 처리는1byte 사용하고 숫자 65로 인코딩된다.
  • UTF-16은 ASCII와 호환되지 않는다
    • 영문 A는 2byte를 사용하고, 숫자 [0, 65]로 인코딩된다.
  • 한글
  • EUC-KR 은 한글 인코딩에 2byte 를 사용한다.
  • UTF-8은 한글 인코딩에 3byte를 사용한다.

 

참고 자료:

https://thedaftpigeon.tistory.com/10