먼저
"유니코드와 멀티바이트를 비교하라"
는 질문을 받았고 간단하게 대답을 하려면
멀티 바이트는 문자를 다양한 바이트로 표현하는 인코딩 방식
유니코드는 세계 모든 문자를 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://ju3un.github.io/encodng-unicode-ansi/
http://ohyecloudy.com/pnotes/archives/205/
'공부 > 그 외' 카테고리의 다른 글
EC2 인스턴스를 활용한 서버 구축 및 외부 접속 작업 (0) | 2024.07.14 |
---|---|
함수형 프로그래밍(Functional Programming) (0) | 2022.09.26 |
객체 지향 프로그래밍(OOP) (0) | 2022.09.11 |
Visual Studio 문자 집합 사용(유니코드, 멀티바이트) (0) | 2021.12.08 |
C2678 : 이항 '~': 왼쪽 피연산자로 '~' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다. (0) | 2021.09.02 |