공부/그 외

멀티바이트(Multibyte), 유니코드(Unicode), ANSI 그리고 ASCII

sudo 2022. 9. 23. 04:10

먼저

"유니코드와 멀티바이트를 비교하라"

는 질문을 받았고 간단하게 대답을 하려면

 

멀티 바이트는 문자를 다양한 바이트로 표현하는 인코딩 방식

유니코드는 세계 모든 문자를 2바이트 길이의 바이너리(=코드)와 매핑해놓은 코드표(=문자열 셋)이다(예를 들어 '가' 라는 문자를 U+AC00 이런식의 코드에 매핑)  

 

이렇게 대답하면 좋을 것 같다.

 

앞서 유니코드와 멀티바이트를 비교 하려고 하는데 엄밀히 이야기하면 비교 대상이 잘못됐다. 명확한 비교는 WBCS과 MBCS(흔히 말하는 멀티바이트)를 비교해야한다(유니코드가 WBCS의 형태라서 이렇게 통상적으로 비교하는 듯 하다).

 

먼저 문자열 셋(Chracter Set)과 인코딩에 대한 이해가 필요하다. 문자와 바이너리를 매핑시켜주는 표를 문자열 셋(Character Set)이라고 한다. 그리고 인코딩이란 문자에 매핑해놓은 바이너리를 몇바이트로 할당했다고 생각하고 읽을 것인지 정한 것이다. 

 

예를 들어 A라는 문자열을 이진수로 10001 이렇게 표현했을 때, 컴퓨터가 "문자에 1바이트가 할당됐을 것"이라고 생각하면 A를 00010001 이렇게 인식하고 읽을 것이다. 2바이트가 할당됐다고 생각하면 00000000 00010001 이렇게 인식할 것이다. 이게 인코딩이다. 이런 인코딩 방식 중 하나가 UTF-8 같은 방식인 것이다.

 

참고 : https://www.youtube.com/watch?v=1jo6q4dihoU 

 

유니코드는 그냥 문자(ex. 가, 나, 다)와 바이너리를 매핑시켜주는 '하나의 표'일 뿐이다. 그에 반해 멀티바이트는 유니코드처럼 표가 아니라 문자를 가변 길이로 '인코딩하는 방식'을 의미한다. 

 

UTF-8

유니코드를 인코딩하는 가변 인코딩 방식. 가변 인코딩인 방식인 이유는 글자마다 byte길이를 다르게 적용하기 때문이다. 예를 들어 'a'는 1byte이고, '가'는 3byte 이런식이다. 문자 마다 몇바이트인지 구분하기 위해 첫 바이트에 표시를 해주는데 2byte는 이진수 110 으로 시작하고 3byte는 이진수 1110으로 시작하고 나머지는 이진수 10으로 시작한다고 한다. 이런식으로 약속한 인코딩 방식이 UTF-8이다. 

 

아스키 코드

1바이트 중 7bit를 이용해서 문자를 표현하고 나머지 1bit는 parity bit로 사용. 총 128개의 문자(출력 불가능한 제어 문자 33개 + 공백을 포함한 출력 가능 문자 95개)를 표현할 수 있는 인코딩 방식이다.

ANSI

ANSI 자체는 사실 기관명(American National Standards Institute)이지만 보편적으로 ANSI는 코드페이지, 더 자세히 말하면 지금 나의 시스템에서 디폴트로 사용하고 있는 코드 페이지("the default local/codepage for my system"이라고 한다)를 의미 한다. 메모장에서 인코딩을 지정하지 않고 저장한 경우 'ANSI'라고 표시되는데 이는 잘못된 표기다. 실제 인코딩은 System Local을 따라가므로 한글 Windows에선 ANSI = CP949이다.

 

ANSI는 8bit를 쓰는데 7bit는 ASCII와 동일하며 1bit는 코드 페이지를 나타낸다.

이 말의 의미를 오해하면 안되는데, 코드 페이지는 따로 저장이 되어있는 상태에서 0 ~ 2^7까지는 아스키 코드 그대로, 2^7 ~ 2^8 까지는 저장된 코드 페이지에 대한 문자들을 의미하는 것이다. 그래서 만약에 윈도우에 저장된 코드 페이지가 일본어면 2^7 ~ 2^8까지는 히라가나로 매핑되어 있을 것이다(나는 1bit로 코드 페이지를 나타낸다길래 그러면 0아니면 1인데 코드 페이지가 두개밖에 없나? 라고 생각했다...)

 

멀티바이트

아스키 코드에 속하는 영어는 1바이트, 그외 아스키 코드에 속하지 않는 언어들은 2바이트로, 이처럼 가변 길이 인코딩 방식을 의미한다. 특정 문자 집합마다 코드 페이지가 존재한다. EUC-KR, UTF(Unicode Transform Format)-8 모두 멀티바이트 인코딩 방식이다. 문자 집합마다 코드 페이지가 따로 존재해서 문자가 깨질 우려가 있다.

  • EUC-KR : 아스키 코드 범위 내 문자들은 1바이트, 한글은 2바이트로 표현하는 가변 길이 인코딩 방식
  • UTF-8 : 한 문자를 나타내는데 1~4바이트를 사용하는 가변 길이 인코딩 방식

유니코드

유니코드는 그저 바이너리와 문자를 매핑 하는 표를 의미할 뿐, 특정 인코딩 방식을 의미하는 것이 아니다. 문자 하나당 2바이트를 사용한다. 전 세계의 모든 문자들을 코드 페이지에 다 넣었다. 따라서 문자마다 코드 페이지가 존재 하는게 아니라 하나의 코드 페이지만 존재한다. 그래서 코드 페이지가 달라서 문자들이 깨질 염려가 없다.

 

Reference에 이렇게 쉽게 정리해주셨다.

SBCS(Single Byte Character Set): 한 문자를 1byte로 표현하는 방식
MBCS(Multi Byte Character Set): 한 문자를 다양한 byte로 표현하는 방식
WBCS(Wide Byte Character Set): 한 문자를 2byte로 표현하는 방식

SBCS --> ASCII 코드
WBCS --> Unicode
MBCS --> ASCII 코드와 Unicode를 혼용하여 사용하는 방식

 

Reference

https://jeongdowon.medium.com/unicode%EC%99%80-utf-8-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-b6aa3f7edf96

 

Unicode와 UTF-8 간단히 이해하기

유니코드(Unicode)

jeongdowon.medium.com

https://ju3un.github.io/encodng-unicode-ansi/

 

인코딩(Encoding) - ASCII, ANSI, Multi-Byte, Unicode 등 - (1)

1. 아스키(ASCII) 코드 (American Standart Code for Information Interchage)의 약자 컴퓨터는 숫자(0과1)만 인식할 수 있기 때문에, 숫자와 문자를 대응시킨 것 영문 알파벳을 사용하는 대표적인 문자 인코딩 7bit

ju3un.github.io

https://umbum.dev/328

 

Encoding 정리. Unicode, ANSI, UTF, CP949

Unicode 유니코드 자체는 특정 encoding 방식을 가리키는 말이 아니라, 순서(U+????)와 문자를 1:1로 매핑해놓은 하나의 코드표를 가리킨다. ANSI와 달리 전세계 글자를 하나의 코드표에 표현하기 위에

umbum.dev

https://vigli.tistory.com/52

 

문자 인코딩이란?

글 내용이 많지만 문자 인코딩이 궁금하다면 꼭 읽기 바란다. 우선 인코딩을 위키 백과에 나온 설명으로 보면 '정보의 형태나 형식을 변환하는 처리나 처리 방식이다.' 라고 정의 되어 있다. (

vigli.tistory.com

http://ohyecloudy.com/pnotes/archives/205/

 

#unicode - (2) UTF-16(wide character) in Windows

Windows에서 Unicode 인코딩은 UTF-16을 기본으로 사용하고 Unicode라고 부르기보다는 wide character라고 부른다. 그래서 Windows에서 wide character는 UTF-16 character라고 생각하면 된다. wide character 자료형인 wchar_

ohyecloudy.com