본문 바로가기
개발 관련

유니코드 인코딩 BOM(Byte Order Mark) 정리

by dev_drive 2022. 9. 14.
반응형

 

문자 인코딩(Encoding)이란?

문자 인코딩은 사용자가 입력한 문자나 기호를 컴퓨터가 이해할 수 있는 것으로 만드는 것을 의미합니다. 

 
 
 

1. 인코딩의 종류

텍스트 파일을 저장할 때 인코딩 형식을 선택할 수 있는데 인코딩 개념을 아시는 분이라면 텍스트 파일을 저장할 때 위 사진 처럼 인코딩을 설정해서 저장해 보신적이 있을겁니다.
 
인코딩의 종류는 엄청 다양하지만 크게 ANSI, UTF-8, UTF-8(BOM), UTF-16 Little Endian, UTF-16 Big Endian 5가지로 나눌 수 있습니다. 
 
 

BOM(Byte Order Mark) 이란?

BOM은 바이트 순서를 표시하는 것으로 문서 맨 앞에 인코딩 방식에 관련된 문자를 넣어서 인코딩 방식을 표현하는 것입니다.  이 문자는 단순히 인코딩 구분을 위한 것으로 눈에는 보이지 않아서 UltraEdit같은 헥사 편집이 가능한 프로그램으로 값을 확인할 수 있습니다.

 
 
 

인코딩에 따른 BOM 표현 

인코딩 방식BOM(Byte Order Mark)
UTF-8EF BB BF
UTF-16 Big EndianFE FF
UTF-16 Little EndianFF FE
UTF-32 Big Endian00 00 FE FF
UTF-32 Little EndianFF FE 00 00

일반적으로 우리에게 익숙한 방식은 왼쪽에서 오른쪽으로 읽는 Big Endian(0xFEFF) 방식입니다.  Little Endian방식은 바이트 오더가 거꾸로 되어있기 때문에 반대로 읽습니다.   이렇게 Endian이 나눠진 이유는 표준이 없는 상태에서 각각의 장단점이 있기때문에 CPU 회사마다 다르게 처리했기 때문입니다. 
-> 문자에 적용된 인코딩과 다른 인코딩으로 읽을 경우 글자가 깨지는 이유가 바로 이런 것 때문입니다. 
 
 

엔디안(Endian)이란?

메모리와 같은 1차원의 공간에서 여러 개의 연속된 대상을 배열하는 방법

 
 
 

UTF-8과 UTF-8(BOM)의 차이 

UTF-8과 UTF-8(BOM)의 차이는 문서 앞 BOM코드 유무에 따른 차이입니다.   하지만 BOM이 존재해야 문서의 인코딩이 무엇인지 알 수 있는데 BOM이 없는 경우는 어떻게 처리할까요?
-> 100% 확실하게 파악할 순 없는 것으로 알고 있지만 보통 문서의 코드를 분석해서 UTF-8 문서라고 판단합니다.
 
🔽 구분 방법이 궁금하시면 아래 글을 참고해주세요.

[C++/MFC] 텍스트 파일의 인코딩 확인하는 방법

유니코드 인코딩 BOM(Byte Order Mark) 정리 문자 인코딩(Encoding)이란? 문자 인코딩은 사용자가 입력한 문자나 기호를 컴퓨터가 이해할 수 있는 것으로 만드는 것을 의미합니다. 1. 인코딩의 종류 텍스

dev-drive.tistory.com

 
 

2. 인코딩 설명

2.1 Ascii (American Standard Code for Information Interchange)
-> 최초의 문자 인코딩으로 가장 기본이 되는 인코딩입니다.  7bit로 구성되어 있으며, 영어, 숫자, 특수문자, 기호 등 128개의 문자를 표현할 수 있습니다.  영어만을 위해서 만들어졌고 한글, 일본어 등 다른 언어는 표현이 불가능합니다. 
 
 
2.2 Ansi (American National Standard Institute)
-> Ascii에서 불가능하던 다른 언어를 지원하기 위해서 만들어 졌습니다.  8bit로 구성되어 있으며 256개의 문자를 표현할 수 있습니다.  Ansi는 Ascii의 확장 형식으로 뒤의 7bit는 동일하고 1bit를 더 사용해서 다른 언어의 문자를 표현합니다.  이 때 만들어진 개념이 CodePage라는 개념입니다.  각 언어별로 Code 값을 주고, Code마다 다른 문자열 표를 의미하도록 약속했습니다. 
 
 
2. 3 EUC-KR (Extended Unix Code-Korea)
->한글 지원을 위해 유닉스 계열에서 나온 완성형 코드입니다.  여기서 나온 개념이 조합형 코드와 완성형 코드인데 조합형 코드는 한글 자음과 모음에 각각의 코드를 부여한 후 초성, 중성, 종성을 조합하여 하나의 문자를 나타내는 방식이고 완성형 코드는 완성된 문자 하나하나마다 코드 번호를 부여한 것으로 현재 조합형 코드는 잘 사용되지 않습니다.  
 
  여기서 KSC5601과 KSC5636 이 등장하는데 KSC5601은 한글 완성형 표준(2350자)이고 다른 말로 KS X 1001이라고도 합니다.  그리고 KSC5636은 영문자에 대한 표준으로 기존 Ascii Code에서 역슬래시(\)를 원표시(₩)로 대체해서 표시하며 다른 말로 KS X 1003이라고도 합니다.  KSC5601과 KSC5636을 합친 것이 EUC-KR입니다. 
 
  하지만 EUC-KR로도 모든 한글을 표현할 수 없다는 문제가 있습니다.  특수문자나 한자를 같이 배치하다보니 자리가 모자라서 한글을 2350자 밖에 할당하지 못했기 때문에 ‘똠방각하’, ‘롹앤롤’, ‘뷁’ 같은 글자는 표시할 수 없으며 주로 웹에서 한글 표현을 위해 사용합니다.
 
 
2. 4 CP949 (Code Page 949)
-> CP949는 한글 지원을 위해 윈도우즈 계열에서 나온 확장 완성형 코드 조합입니다.  EUC-KR은 2byte의 완성형 코드로 2byte 내에서는 표현의 한계가 있었기 때문에 EUC-KR을 확장하여 만든 것이 CP949입니다.  여기서 949는 한국의 페이지 번호를 의미합니다. (일본어는 CP932, 중국어 간체는 CP936입니다.)
 
EUC-KR의 코드를 가져오고 나머지 표현되지 않는 8000개의 한글을 ms가 임의로 배치하여 만들어진 방식입니다.  따라서 CP949방식이면 EUC-KR과 호환이 되어, 모든 문자를 읽을 수 있고 반대의 경우는 일부 한글이 깨질 수 있습니다.  마이크로소프트가 만들었다고 해서 MS949라고도 표현합니다. 
 
 
2. 5.  UTF-8 (Universal Coded Character Set + Transformation Format – 8-bit)
-> UTF-8은 유니코드를 위한 가변 길이 문자 인코딩(멀티바이트) 방식 중 하나로, Ansi의 단점을 보완하기 위해 만들어 졌습니다.  Ansi는 다국어를 지원하기 위해 CodePage 정보를 미리 알고 있어야하는데, UTF-8은 멀티바이트 개념을 사용하여 하나의 Character Set에 거의 모든 문자를 넣어서 표현합니다. 
 
UTF-8은 유니코드 한 문자를 나타내기 위해 1byte에서 4byte까지 사용합니다.  영어와 같은 Ascii문자들은 1byte를 사용하고 중동지역 언어나 유럽 언어 등은 2byte, 한글, 중국, 일본 등의 언어는 3byte로 표현합니다. 이와 같이 UTF-8은 가변적으로 공간을 할당하여 사용합니다.
 
 
2. 6.  UTF-16 (Universal Coded Character Set + Transformation Format – 16-bit)
-> UTF-8의 변형으로 16bit 기반으로 표현합니다.   한글의 경우 UTF-8로 저장할 경우 한 글자당 3byte가 필요한데, UTF-16으로 저장하면 2byte로 표현할 수 있어서 용량의 이점이 있습니다.  그렇지만 모두 그런것은 아니고 주로 사용되는 BMP(Basic multilingual plane)에 속하는 문자들은 그대로 16비트로 표현하고 그 이상의 문자들은 32비트로 인코딩됩니다. 
 
  단점으로는 Ansi와 호환이 되지 않는다는 것이 있고 2byte이기 때문에 리틀엔디안(Little Endian), 빅엔디안(Big Endian)이 필요합니다.  
 
 
2. 7.  UTF-32 (Universal Coded Character Set + Transformation Format – 32-bit)
  UTF-32는 모든 문자를 4byte로 인코딩합니다.  문자 변환 알고리즘이나 인코딩 방식에 대한 고민을 하고 싶지 않을 때 유용하게 사용할 수 있지만 매우 비효율적으로 메모리를 사용하므로 자주 사용되지는 않습니다.
 
 
 
※ 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현할 수 있도록 고안된 코드 조합이며 유니코드 자체는 인코딩이 아닙니다.  유니코드는 전 세계 거의 모든 문자를 2byte 숫자로 1:1 맵핑 시키는 방식을 말하고, 유니코드를 UTF-8, UTF-16 등의 여러가지 인코딩 방식으로 표현하는 것입니다.
 
 

반응형

댓글