ASCII (American Standard Code for Information Interchange)
ASCII는 최초의 문자열 인코딩이다. 7비트로 구성이 되어있으며 영어 문자, 숫자, 특수문자, 기호 등 128개의 문자를 표현할 수 있다.
영어만을 고려하여 만들어졌기 대문에 다른 언어의 표현이 불가능하다.
여기서 다른 언어를 지원하기위해 만들어진 인코딩이 ANSI이다.
ANSI (American National Standard Institute)
ANSI는 8비트로 구성되어 있으며 256개의 문자를 표현할 수 있다.
ANSI는 ASCII의 확장판으로 이해하면 된다.
앞 7비트는 ASCII와 동일하고 맨뒤의 1비트를 이용하여 다른 언어의 문자를 표현한다.
그런데 새로 추가된 128개 문자로는 모든 언어의 문자를 표현할 수 없다.
그래서 생긴 개념이 CodePage 이다.
각 언어별로 Code 값을 주고 Code 마다 다른 문자열 표를 의미하도록 약속을 했다.
쉽게 생각하면 아래와 같다.
ANSI(8bit) = ASCII(7bit) + CodePage(1bit)
영어 외의 다른 언어를 사용할 경우 ANSI는 CodePage를 동일하게 맞춰주면 된다.
CodePage가 다를 경우 의도와 다른 결과가 나올 수 있다.
EUC-KR
EUC-KR은 한글 지원을 위하여 유닉스 계열에서 나온 완성형 코드 조합이다.
완성형 코드란 완성된 문자 하나하나마다 코드 번호를 부여한 것으로 반대되는 개념으로는 조합형 코드가 있다. 예를들면 한글의 자음과 모음 각각에 코드 변호를 부여한 후 초성, 중성, 종성을 조합하여 하나의 문자를 나타내는 방식이다.
EUC-KR은 ANSI를 한국에서 확장한 것으로 외국에서는 지원이 안될 가능성이 높다.
CP949
CP949는 한글 지원을 위해 윈도우즈 계열에서 나온 확장 완성형 코드 조합이다.
EUC-KR은 2byte의 완성형 코드로 표현할 수 있는 완성된 문자의 수의 한계가 있었다.
그래서 MS에서 EUC-KR을 개선, 확장하여 만든것이 CP949이다. 기본적으로 EUC-KR과 호환이 되며, EUC-KR에서 표현이 되지 않는 문자는 조합을 하여 표현한다.
MS에서 만들었다고 하여 MS949라고 부르기도 한다.
UTF-8 (Universal coded character set + Transformation Format 8 bit)
UTF-8은 유니코드를 위한 가변 길이 문자 인코딩, 즉 멀티바이트 방식 중 하나로 ANSI의 단점을 보완하기 위해 만들었다. ANSI는 다국어를 지원하기 위하여 CodePage 정보를 미리 알고 있어야 한다는 단점이 있는데 UTF-8은 멀티바이트의 개념을 사용하여 하나의 Character set에 거의 모든 문자를 담았다.
멀티바이트란 표현해야 하는 문자에 따라 글자 크기를 가변으로 변경하여 사용하는 것을 말한다.
ANSI와 비교를 하면 ANSI는 1byte 고정바이트를 사용하여 표현을 하지만 UTF-8은 멀티바이트로 1~4byte를 가변적으로 사용하도록 되어있다.
첫 128자는 ASCII 코드 값으로 ANSI와 UTF-8이 동일하다. 그래서 영어를 사용할 경우 1byte만 사용한다.
중동지역 언어 또는 많은 유럽 언어는 2byte를 사용하며, 한국, 중국, 일본 등 동아시아권 언어는 3byte이상을 사용한다. UTF-8은 매우 일반적인 인코딩 방식이지만 3byte 이상의 문자를 사용할 경우에는 비효율적일 수 있다.
UTF-16
16bit 기반으로 저장하는 UTF-8의 변형이라고 볼 수 있다.
한글의 경우 UTF-8로 저장을 할 경우 3byte가 필요한데 UTF-16으로 저장을 하면 2byte면 되기 때문에 용량의 이점이 있다고 한다.
그러나 경우에 따라 2byte 이상을 사용하는 경우도 있고, 엔디안 처리를 고려함에 따른 복잡성 증대나, ANSI와 호환이 되지 않는다는 단점이 있다.
UNICODE
유니코드는 전세계의 모든 문자를 컴퓨터에서 일관되게 표현할 수 있도록 고안된 코드 조합이다.
여기서 주의할 점은 유니코드는 '인코딩'이 아니라는 것이다. 유니코드는 전세계 거의 모든 문자를 2byte 숫자로 1대1 매핑시키는 '방식'을 말하는 것이며 유니코드를 표현하는 여러가지 '인코딩' 방식들이 존재하는 것이다. UTF-8, UTF-16 등이 그렇다.
유니코드는 목록을 통해 매핑 테이블을 확인할 수 있다.
BOM (Byte Order Mark)
빅엔디안과 리틀엔디안은 메모리 저장방식의 차이.
AC 00 이라는 값을 저장할 때 빅 엔디안은 AC 00 리틀엔디안은 00 AC 으로 저장한다.
이러한 저장방식의 차이를 다른 프로그램에게 설명하기 위해서 특정한 값이 필요하고, 유니코드 문서의 첫 번째에 특정한 값을 삽입하여주는것을 BOM이라 한다.
- UTF-8 BOM : EF BB BF
- UTF-16 BE BOM : FE FF
- UTF-16 LE BOM : FF FE
BOM으로 인한 문제
UTF-8 은 저장 방식의 차이가 없기 때문에 BOM이 없어도 되지만, 몇몇 프로그램에서는 BOM을 삽입하고 있다. 이로 인하여 파일을 읽을 때 첫번째 문자가 깨지는 현상이 발생하게 된다.Notepad++ 같은 프로그램을 이용할 때에는 저장할 때 BOM 없이 저장을 하도록 설정하여 주는것이 좋다.
댓글 없음:
댓글 쓰기