문자 인코딩과 Unicode: UTF-8, UTF-16 및 레거시 인코딩 가이드
컴퓨팅 초기에는 텍스트를 표현하는 것이 간단했습니다. 모든 문자가 7비트 또는 8비트(ASCII) 안에 들어갔기 때문입니다. 하지만 컴퓨터가 전 세계적으로 보급되면서 전 세계 모든 언어의 모든 문자를 표현할 방법이 필요해졌습니다. 이것이 바로 유니코드(Unicode)와 이를 지원하는 인코딩들의 이야기입니다.
1. 유니코드(Unicode) 표준
유니코드는 그 자체로 인코딩이 아니라 유니버설 문자 집합입니다. 모든 문자에 코드 포인트라고 불리는 고유한 번호를 할당합니다(예: 'A'는 U+0041). 하지만 이 번호들을 바이너리로 저장하는 방식은 별도로 필요합니다.
UTF-8 (웹의 표준)
UTF-8은 한 문자당 1바이트에서 4바이트를 사용하는 가변 길이 인코딩입니다. ASCII와 하위 호환성을 가집니다.
- 장점: 서구권 언어에 효율적이며, 데이터 손상에 강하고, 웹의 표준으로 자리 잡았습니다.
UTF-16
2바이트 또는 4바이트를 사용합니다. Windows(NTFS) 시스템과 Java, JavaScript 등 많은 프로그래밍 환경의 내부 인코딩으로 사용됩니다.
UTF-32
모든 문자에 대해 고정적으로 4바이트를 사용합니다. 인덱싱은 간단하지만 메모리 효율이 매우 낮습니다.
2. 레거시 및 지역별 인코딩
유니코드가 대중화되기 전에는 지역마다 고유한 표준을 사용했으며, 그 중 많은 것들이 오늘날에도 여전히 발견됩니다.
한국어 인코딩
- EUC-KR: 한국어 전용 레거시 인코딩의 표준입니다.
중국어 인코딩 (GB 패밀리)
- GB2312: 초기 간체 중국어 표준입니다.
- GBK: GB2312를 확장하여 더 많은 문자를 지원합니다.
- GB18030: 현재 중국의 국가 표준으로, 간체와 번체를 모두 지원하며 유니코드와 완전히 매핑됩니다.
일본어 및 번체 중국어
- Shift-JIS: 역사적으로 일본에서 가장 널리 사용된 인코딩입니다.
- Big5: 대만, 홍콩 등에서 사용되는 번체 중국어 표준입니다.
3. 서구권 레거시 인코딩
ISO-8859-1 (Latin-1)
대부분의 서유럽 언어를 커버하는 8비트 인코딩입니다.
Windows-1252
ISO-8859-1의 변형으로, 과거 Windows 시스템의 기본 인코딩이었습니다.
4. 기술적 상세: BOM과 엔디언(Endianness)
Byte Order Mark (BOM)
BOM은 텍스트 파일 시작 부분의 특수한 바이트 시퀀스입니다(예: UTF-8은 EF BB BF). 소프트웨어에 어떤 인코딩과 바이트 순서가 사용되는지 알려줍니다. UTF-16에서는 유용하지만, 웹 환경의 UTF-8에서는 사용하지 않는 것이 권장됩니다.
Little Endian vs. Big Endian
UTF-16 및 UTF-32와 관련이 있으며, 메모리에 바이트가 저장되는 순서를 의미합니다.
비교 요약
| 인코딩 | 문자당 바이트 | 호환성 | 최적의 용도 |
|---|---|---|---|
| UTF-8 | 1-4 | ASCII | 웹, 리눅스, 맥 |
| UTF-16 | 2 또는 4 | 없음 | 윈도우, 자바, JS |
| GB18030 | 1, 2, 또는 4 | GBK | 중국 정부 표준 준수 |
| ASCII | 1 | 범용 | 레거시 시스템, 영어 전용 |
결론
전 세계는 데이터 교환의 표준으로 UTF-8을 선택했습니다. 하지만 레거시 시스템이나 특정 지역용 소프트웨어를 다룰 때는 EUC-KR이나 Shift-JIS 같은 지식이 여전히 필요합니다. 현대적인 애플리케이션 개발에서는 특별한 이유가 없는 한 BOM이 없는 UTF-8을 사용하세요.