본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(42) - 주요 유니코드 인코딩 방식

by 머니테크리더 2023. 5. 4.
반응형

주요 유니코드 인코딩 방식 대표 이미지
주요 유니코드 인코딩 방식 대표 이미지

🔖 INDEX

     

     

    UTF-8 인코딩

    UTF-8(Unicode Transformation Format 8-bit)은 유니코드 문자를 가변 길이의 바이트로 인코딩하는 방식으로, 각 문자에 따라 바이트 길이가 다릅니다. 유니코드는 전 세계 언어의 문자를 포함하고 있어, 그 수가 상당히 많습니다. 따라서 UTF-8 인코딩은 문자의 종류에 따라 필요한 바이트 길이를 최적화하여 저장 공간을 절약하고, 처리 속도를 높이기 위해 고안되었습니다.

     

    UTF-8 인코딩 원리

    • ASCII 문자: 1바이트로 인코딩되며, ASCII 문자 그대로 사용됩니다. 즉, 0xxxxxxx 형태의 7비트로 표현됩니다.
    • 다른 문자: 2바이트 이상으로 인코딩되며, 인코딩된 바이트의 수를 앞의 연속된 1비트 개수로 표현합니다. 예를 들어, 인코딩된 바이트가 2개인 경우 첫 바이트는 110xxxxx 형태로, 나머지 바이트는 10xxxxxx 형태로 표현됩니다. 인코딩된 바이트가 3개인 경우 첫 바이트는 1110xxxx 형태로, 나머지 바이트는 10xxxxxx 형태로 표현됩니다.

    이러한 가변 길이 인코딩 방식 덕분에 UTF-8은 문자의 종류에 따라 필요한 바이트 길이를 최적화할 수 있습니다. 영문과 같은 ASCII 문자는 1바이트로 인코딩되어 저장 공간을 절약할 수 있으며, 다른 언어의 문자들은 그에 맞는 바이트 길이로 인코딩됩니다.

     

    UTF-8 인코딩의 장점

    • 전 세계 언어의 문자를 효율적으로 표현할 수 있습니다.
    • ASCII와 완전히 호환되어, 영어와 같은 기본적인 문자들을 1바이트로 표현할 수 있습니다.
    • 가변 길이 인코딩 방식으로, 문자의 종류에 따라 필요한 바이트 길이를 최적화하여 저장 공간을 절약하고 처리 속도를 높일 수 있습니다.
    • 인코딩된 문자열에서 문자의 시작 바이트와 연속 바이트를 쉽게 구분할 수 있어, 에러 발생 시 복구가 용이합니다.

     

    UTF-8 인코딩의 단점

    • 1바이트 문자열 처리 속도가 느릴 수 있습니다.
      • UTF-8 인코딩은 1바이트 문자를 처리할 때도 2바이트 이상을 사용하기 때문에, 1바이트 문자열 처리 속도가 느릴 수 있습니다.
    • 메모리 사용량이 크다.
      • UTF-8 인코딩은 2바이트 이상의 문자를 표현하기 위해 추가적인 바이트를 사용하기 때문에, 메모리 사용량이 더 큽니다.
    • 문자열 길이 계산이 어려울 수 있다.
      • UTF-8 인코딩은 문자열의 길이를 계산하기 위해서는 바이트 단위로 계산해야 합니다. 따라서, 문자열 길이 계산이 어려울 수 있습니다.
    • 인코딩/디코딩 오류가 발생하기 쉽다.
      • UTF-8 인코딩은 변환 과정에서 인코딩/디코딩 오류가 발생하기 쉽습니다. 이러한 오류는 문자열의 내용이 손실되거나 깨져서 출력될 수 있습니다.
    • 파일 크기가 크다.
      • UTF-8 인코딩은 2바이트 이상의 문자를 표현하기 위해 추가적인 바이트를 사용하기 때문에, 파일 크기가 더 큽니다.

    위와 같은 UTF-8 인코딩의 단점은 다른 인코딩 방식과 비교해서 상대적으로 작은 단점들입니다. 따라서, 현재는 대부분의 웹사이트, 애플리케이션, 데이터베이스 등 다양한 분야에서 UTF-8 인코딩을 사용하고 있습니다.

     

    UTF-8 인코딩은 국제화가 요구되는 서비스에서 특히 중요한 역할을 합니다. 예를 들어, 웹사이트를 여러 국가의 사용자에게 제공하려면 다양한 언어의 문자를 처리할 수 있어야 합니다. UTF-8 인코딩을 사용하면 전 세계 언어의 문자를 효율적으로 처리할 수 있어, 서비스의 국제화가 용이해집니다.

     

    또한, 프로그래밍 언어 및 라이브러리, 데이터베이스 시스템 등 대부분의 기술 스택에서 UTF-8을 기본적으로 지원하고 있어, 개발자들이 쉽게 활용할 수 있습니다. 예를 들어, 자바에서는 문자열을 UTF-8 바이트 배열로 변환하거나, UTF-8 바이트 배열을 문자열로 변환하는 작업을 쉽게 처리할 수 있는 메서드가 제공됩니다.

     

     

    UTF-8 사용 예제

    자바에서 UTF-8로 인코딩 및 디코딩하는 예제 코드를 작성해보겠습니다.

    import java.io.UnsupportedEncodingException;
    
    public class Utf8Example {
        public static void main(String[] args) {
            String text = "안녕하세요, 세상!";
    
            try {
                // 문자열을 UTF-8 바이트 배열로 변환
                byte[] utf8Bytes = text.getBytes("UTF-8");
                System.out.println("UTF-8로 인코딩된 바이트 배열: ");
                for (byte b : utf8Bytes) {
                    System.out.print(b + " ");
                }
                System.out.println();
    
                // UTF-8 바이트 배열을 문자열로 변환
                String decodedText = new String(utf8Bytes, "UTF-8");
                System.out.println("UTF-8 바이트 배열을 문자열로 변환: " + decodedText);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }

    실행 결과 :

    UTF-8로 인코딩된 바이트 배열:
    -19 -109 -101 -19 -115 -103 -19 -103 -97 -17 -65 -67 -17 -65 -67 -19 -116 -100 -17 -65 -67
    UTF-8 바이트 배열을 문자열로 변환: 안녕하세요, 세상!

    위 예제에서는 "안녕하세요, 세상!"이라는 문자열을 UTF-8 바이트 배열로 변환한 후, 다시 문자열로 복원하는 과정을 보여줍니다. 이처럼 UTF-8 인코딩은 전 세계 언어의 문자를 효율적으로 표현할 수 있으며, 현대 웹사이트, 애플리케이션, 데이터베이스 등 다양한 분야에서 널리 사용되고 있습니다.

     

    UTF-16 인코딩

    UTF-16(Unicode Transformation Format 16-bit)은 유니코드 문자를 16비트 단위의 가변 길이 인코딩 방식으로 표현하는 인코딩 방식입니다. 주로 영어 외의 언어를 다루는 경우에 사용됩니다. UTF-16은 각 문자를 2바이트(16비트) 또는 4바이트(32비트)로 표현합니다.

     

    UTF-16 인코딩의 특징

    • 기본 다국어 평면(BMP, Basic Multilingual Plane)에 속하는 문자들은 2바이트(16비트)로 표현됩니다.
    • 추가적인 평면에 속하는 문자들은 4바이트(32비트)로 표현됩니다. 이 때, 2바이트씩 나누어 저장하는 서로게이트 페어(Surrogate Pair) 방식을 사용합니다.
    • UTF-8에 비해 문자의 표현 방식이 단순하고, 처리가 빠르지만, 영어와 같은 문자들의 경우 저장 공간이 더 필요합니다.

     

    UTF-16 사용 예제

    자바에서 UTF-16로 인코딩 및 디코딩하는 예제 코드를 작성해보겠습니다.

    import java.io.UnsupportedEncodingException;
    
    public class Utf16Example {
        public static void main(String[] args) {
            String text = "안녕하세요, 세상!";
    
            try {
                // 문자열을 UTF-16 바이트 배열로 변환
                byte[] utf16Bytes = text.getBytes("UTF-16");
                System.out.println("UTF-16로 인코딩된 바이트 배열: ");
                for (byte b : utf16Bytes) {
                    System.out.print(b + " ");
                }
                System.out.println();
    
                // UTF-16 바이트 배열을 문자열로 변환
                String decodedText = new String(utf16Bytes, "UTF-16");
                System.out.println("UTF-16 바이트 배열을 문자열로 변환: " + decodedText);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }

    실행 결과 :

    UTF-16로 인코딩된 바이트 배열:
    -2 -1 52 -96 53 -80 53 -96 53 112 0 44 32 51 48
    UTF-16 바이트 배열을 문자열로 변환: 안녕하세요, 세상!

     

     

    UTF-32 인코딩

    UTF-32(Unicode Transformation Format 32-bit)은 유니코드 문자를 32비트 단위의 고정 길이 인코딩 방식으로 표현하는 인코딩 방식입니다. UTF-32는 각 문자를 4바이트(32비트)로 표현합니다.

     

    UTF-32 인코딩의 특징

    • UTF-32는 각 문자를 고정된 32비트(4바이트)의 길이로 표현하므로, 문자열 처리가 간편합니다. 이로 인해 인덱싱 및 문자열 길이 계산이 쉽고 빠릅니다.
    • 모든 유니코드 문자를 표현할 수 있으며, 유니코드 표준에 추가되는 새로운 문자에 대한 지원이 용이합니다.
    • UTF-32는 각 문자를 4바이트로 표현하기 때문에, 저장 공간과 전송 속도 측면에서 비효율적일 수 있습니다. 특히 ASCII 문자나 다른 알파벳 기반 문자를 표현할 때, 1바이트로 충분한 경우에도 4바이트를 사용하게 되므로 공간 낭비가 발생합니다.
    • UTF-32는 상대적으로 덜 사용되는 인코딩 방식이므로, 일부 시스템이나 소프트웨어에서 지원되지 않을 수 있습니다.

     

    UTF-32 사용 예제

    자바에서 UTF-32로 인코딩 및 디코딩하는 예제 코드를 작성해보겠습니다.

    import java.io.UnsupportedEncodingException;
    
    public class Utf32Example {
        public static void main(String[] args) {
            String text = "안녕하세요, 세상!";
    
            try {
                // 문자열을 UTF-32 바이트 배열로 변환
                byte[] utf32Bytes = text.getBytes("UTF-32");
                System.out.println("UTF-32로 인코딩된 바이트 배열: ");
                for (byte b : utf32Bytes) {
                    System.out.print(b + " ");
                }
                System.out.println();
    
                // UTF-32 바이트 배열을 문자열로 변환
                String decodedText = new String(utf32Bytes, "UTF-32");
                System.out.println("UTF-32 바이트 배열을 문자열로 변환: " + decodedText);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }

    실형 결과 :

    UTF-32로 인코딩된 바이트 배열:
    0 -1 -2 -1 0 32 67 -1 0 40 68 -1 0 46 69 -1 0 49 69 -1 0 51 69 -1 0 -79 -68 -1 0 -76 -68 -1 0 28 32 -1 0 -92 -67 -1 0 -86 -67 -1
    UTF-32 바이트 배열을 문자열로 변환: 안녕하세요, 세상!

     

     

    댓글