* 문자 집합(Charset)이란 컴퓨터에서 사용하는 문자들의 집합입니다. 그 집합들을 어떻게 모아두었느냐에 따라 이름을 정해주어야 구분해서 쓸 수 있겠지요. 문자집합의 이름으로는 유명한 ASCII, ISO8859, 유니코드 등이 있습니다.
* 인코딩은 해당 문자를 어떻게 코드화하겠느냐는 방식을 나타내며, 디코딩은 반대로 어떤 코드를 어떻게 문자화하겠느냐는 방식을 나타냅니다. 마찬가지로 방식에 대한 이름이 있어야 구분해서 사용할 수 있겠지요. 유니코드 인코딩, UTF, Base64, EUC-KR, CP949 등의 이름이 있습니다. 예상할 수 있듯이 문자 집합과 인코딩은 서로 뗄 수 없는 관계이기에 같은 이름이 많네요.
<아스키(ASCII)> - 최초의 문자집합이며 7bit를 사용합니다. ASCII라는 문자 집합을 구성하지 않고 컴퓨터를 개발했다면.. 정말 상상하기도 싫군요..
<ISO/IEC 8859>
- 서유럽의 움라우트와 같은 특수 문자를 포함하기 위해 8bit를 사용하는 표준을 제정.
- ASCII 부분을 유지하므로 당연히 ASCII와 호환됨.
<DBCS (Double-Byte Character Set>
- 한글, 일어, 중국어 등 많은 문자가 필요로 하다보니 더이상 1byte로 표현불가하니 만들어 낸 문자집합.
- ASCII 부분은 유지를 하고, 최상위 비트 0과 1로 확장 부분을 구분. 따라서 ASCII 호환됩니다.
- 확장 부분은 2byte를 사용해서 문자를 구성합니다.
- EUC-KR, CP949 등
<EUC-KR>의 문자 집합 00~7F (ASCII 호환)
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F | |
0 | ||||||||||||||||
10 | ||||||||||||||||
20 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
40 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
50 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
60 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
70 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ |
<EUC-KR>의 문자 집합 B0A0~B0FF
+0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F | |
B0A0 | 가 | 각 | 간 | 갇 | 갈 | 갉 | 갊 | 감 | 갑 | 값 | 갓 | 갔 | 강 | 갖 | 갗 | |
B0B0 | 같 | 갚 | 갛 | 개 | 객 | 갠 | 갤 | 갬 | 갭 | 갯 | 갰 | 갱 | 갸 | 갹 | 갼 | 걀 |
B0C0 | 걋 | 걍 | 걔 | 걘 | 걜 | 거 | 걱 | 건 | 걷 | 걸 | 걺 | 검 | 겁 | 것 | 겄 | 겅 |
B0D0 | 겆 | 겉 | 겊 | 겋 | 게 | 겐 | 겔 | 겜 | 겝 | 겟 | 겠 | 겡 | 겨 | 격 | 겪 | 견 |
B0E0 | 겯 | 결 | 겸 | 겹 | 겻 | 겼 | 경 | 곁 | 계 | 곈 | 곌 | 곕 | 곗 | 고 | 곡 | 곤 |
B0F0 | 곧 | 골 | 곪 | 곬 | 곯 | 곰 | 곱 | 곳 | 공 | 곶 | 과 | 곽 | 관 | 괄 | 괆 |
위와 같이 정해진 위치에 확정된 글자가 명시되어 있으므로 "완성형"입니다. 해당하지 않는 문자를 표현할 수 없는 것이지요. 좀더 추가된 문자를 포함하여 만든 것이 CP949입니다. 마찬가지로 완성형이고, 포함되지 않는 문자는 표현할 수 없습니다.
"안녕Hello"라는 문자열은 총 4byte + 5byte = 9byte를 사용하게 됩니다.
<유니코드(Unicode)>
- 위와 같이 언어별 인코딩이 다른 불편함을 해결하고자 ISO에서 동일한 규칙을 사용하도록 만든 문자집합입니다.
- 유니코드 문자집합을 코드화하기 위한 인코딩에는 UTF-8, UTF-16, UTF-32등이 있습니다.
<UTF-8> 1byte~6byte 가변 문자 길이를 사용합니다. ASCII와 호환.
앞의 3문자 "EF BB BF"는 UTF-8을 나타내는 BOM입니다. [아래에 설명]
"안"은 "EC 95 88", "녕"은 "EB 85 95", Hello는 "48 65 6C 6C 6F"임을 알 수 있습니다.
<UTF-8 인코딩 과정>
- "안" = 0xEC 0x95 0x88 = 1110 1100 1001 0101 1000 1000
- UTF-8 인코딩 테이블을 보면 U+0800 1110으로 시작하는 문자이고 3바이트를 사용하여 표현되고 있습니다.
- U+0800에서 구분을 위하여 사용되는 "1110", "10", "10"을 제외한 나머지를 가지고 변환합니다.
- 1110 1100 1001 0101 1000 1000 => 1100010101001000 => 0xC548
<UTF-16>
- 2byte 또는 4byte를 고정으로 사용하기 때문에 ASCII와 호환되지 않습니다.
<BOM(Byte Order Mark)>
UTF-16의 BE(Big Endian), LE(Little Endian)의 바이트 순서에 따라 바이트를 읽는 순서를 다르게 처리해주어야 합니다.
UTF-8은 Byte Order와 무관하여 "EF BB BF"를 저장하며 처리하는 프로그램도 있고(메모장같은), 처리하지 않는 프로그램도 있습니다. 그래서 Visual Studio나 웹페이지 개발시에 문서의 인코딩 에러가 가끔 나타나는 문제가 있지요. 각각의 프로그램에 맞게 BOM을 삭제하거나 추가하여 사용하면 문제를 해결할 수 있습니다.
'[컴퓨터] > 컴퓨터 일반' 카테고리의 다른 글
아스키코드 테이블 The ASCII Code Table 2021 (0) | 2021.01.23 |
---|