🔷 왜 유니코드가 필요했을까?
과거에는 각 나라나 시스템마다 문자 인코딩 방식이 달라서 서로 다른 컴퓨터 간에 문자가 깨지는 현상(문자파일 호환 문제)이 자주 발생함.
예를 들어:
- 영어권: ASCII (미국식 표준)
- 한국: EUC-KR, CP949
- 일본: Shift_JIS
- 중국: GB2312 등
이런 문제를 해결하기 위해 등장한 게 유니코드.
🔷 유니코드의 목적
전 세계의 모든 문자를 하나의 코드로 통일!
- 영어, 한글, 한자, 일본어, 아랍어, 이모지 등 거의 모든 언어의 문자를 포함함
- 국제화(Internationalization)와 다국어 지원이 쉬워짐
🔷 유니코드 구조
- 각 문자마다 고유한 숫자 코드 포인트(code point)가 있음
- 예)
- A → U+0041
- 가 → U+AC00
- 😁 → U+1F601
🔷 유니코드 인코딩 방식들
유니코드는 문자 집합이고, 이걸 어떻게 실제로 저장하고 전송하느냐가 인코딩 방식.
| 인코딩 | 설명 | 특징 |
| UTF-8 | 가변 길이 (1~4 바이트) | ASCII와 호환 / 웹에서 가장 널리 쓰임 |
| UTF-16 | 2바이트 또는 4바이트 | Windows 내부에서 많이 사용 |
| UTF-32 | 고정 4바이트 | 단순하지만 메모리 비효율 |
🔷 예시
문자 "가"는 유니코드에서 U+AC00이고,
- UTF-8로 인코딩하면 EA B0 80 (3바이트)
- UTF-16으로 인코딩하면 AC 00 (2바이트)
🔷 한글 처리
한글은 초성/중성/종성을 조합해 만들지만, 유니코드는 **완성형 문자(예: 가, 나, 다)**들을 미리 코드로 지정해놓음.
- 가: U+AC00
- 각: U+AC01
- ...
- 총 11,172자의 한글 완성형이 있음
✅ 정리
- 유니코드는 모든 언어를 통합하는 문자 체계
- 코드 포인트는 문자당 고유 숫자
- UTF-8, UTF-16 등의 방식으로 저장/전송
- 유니코드 덕분에 다국어 시스템을 한 번에 처리 가능함
문자를 인코딩하는 방식이 여러개 있다고 하는데, 인코딩이란 개념자체가 뭐지?
🔷 인코딩(Encoding)이란?
"사람이 이해하는 문자"를 컴퓨터가 이해할 수 있게 숫자(바이트)로 바꾸는 과정
쉽게 말해,
- 우리가 쓰는 A, 가, 한, 🐱 같은 **문자(character)**를
- 컴퓨터가 저장하고 처리할 수 있게 **0과 1(=이진수, 바이트)**로 변환하는 것
🔷 왜 인코딩이 필요할까?
컴퓨터는 문자 자체를 이해하지 못해.
오직 숫자(정수)와 바이트(0과 1)만 알아들을 수 있어.
그래서 문자 → 숫자 → 바이트 변환이 필요해.
이걸 해주는 규칙이 바로 인코딩 방식이고, 그 과정을 인코딩이라고 불러.
🔷 인코딩의 예
예1: 영어 문자 'A'
- ASCII 인코딩 기준: 'A' = 65 (10진수)
- 2진수로 바꾸면: 01000001 → 1바이트
예2: 한글 문자 '가'
- 유니코드 인코딩 기준: '가' = U+AC00 (16진수)
- UTF-8 인코딩하면: EA B0 80 → 3바이트
🔷 인코딩 vs 디코딩
| 과정 | 설명 |
| 인코딩 | 문자를 바이트로 바꾸는 과정 ('가' → EA B0 80) |
| 디코딩 | 바이트를 문자로 되돌리는 과정 (EA B0 80 → '가') |
🔷 비유로 설명하자면...
- 문자 → 바이트 변환은 "암호화" 같은 것
- 규칙 없이 막 바꾸면 해석이 안 됨
- 그래서 인코딩은 모두가 공유하는 약속된 규칙이 꼭 필요함
✅ 정리
| 개념 | 설명 |
| 문자(Character) | 사람이 보는 글자 (A, 가, 1, 🐱) |
| 코드 포인트(Code Point) | 문자의 고유한 번호 (유니코드 기준: '가' = U+AC00) |
| 인코딩(Encoding) | 코드 포인트를 바이트로 바꾸는 방법 |
| 디코딩(Decoding) | 바이트를 다시 문자로 바꾸는 과정 |
| 인코딩 방식 | UTF-8, UTF-16, EUC-KR 등 여러 규칙 존재 |
인코딩이 문자를 바이트로 지정하는 규칙이란 것은 알겠어.
그런데 왜 이런 인코딩이 하나로 안쓰고 여러개 존재하는걸까?
🔷 왜 인코딩 방식이 여러 개나 있는가?
1. 호환성 문제 해결 (특히 ASCII와)
- UTF-8은 기존에 많이 쓰던 **ASCII(영어 1바이트 문자)**와 완벽히 호환.
- 예전 시스템들과 호환되게 하면서 유니코드 지원을 늘리고 싶을 때는 UTF-8이 적합.
💬 예: 영어 중심의 웹 환경에서 유니코드 확장이 필요해도 기존 ASCII 깨짐 없이 유지 가능.
2. 메모리 효율성 차이
- 영어만 다룬다면 1바이트로 충분한데, 한글이나 이모지 등은 더 많은 바이트가 필요함.
- UTF-8은 가변 길이 (1~4바이트) → 영어는 1바이트, 한글은 3바이트
- UTF-16은 대부분의 문자(한글, 한자 포함)를 2바이트 고정, 일부만 4바이트
- UTF-32는 무조건 4바이트로 저장함 → 가장 단순하지만 메모리 낭비가 큼
💬 예: 영어 위주라면 UTF-8이 유리, 한중일 위주 시스템은 UTF-16이 메모리 낭비가 적을 수 있음
3. 성능과 처리 속도
- UTF-32는 모든 문자가 4바이트라서 처리 로직이 단순하고 빠름
(문자 수만큼 4*N 하면 바로 위치 찾을 수 있음) - 하지만 메모리 많이 먹음 → 모바일/임베디드에서 불리
- UTF-8 / UTF-16은 가변 길이 → 문자 위치 계산 복잡해짐
💬 예: 게임엔진 내부나 그래픽 툴은 UTF-32 쓰는 경우가 있음 (속도 중시)
4. 특정 플랫폼/시스템의 선택
- Windows 내부는 UTF-16 기반 (WinAPI, C#의 string도 UTF-16)
- 유닉스/리눅스 기반 시스템, 웹은 대부분 UTF-8 기반
🔽 간단 비교 정리
| 인코딩 | 특징 | 장점 | 단점 |
| UTF-8 | 가변 1~4바이트 | ASCII와 호환, 웹 최적 | 문자 길이 계산 복잡 |
| UTF-16 | 가변 2 or 4바이트 | 한중일 문자에 효율적 | 영어는 공간 낭비 |
| UTF-32 | 고정 4바이트 | 처리 단순 | 메모리 낭비 심함 |
✅ 결론
모든 인코딩은 "트레이드오프(속도 vs 메모리 vs 호환성)" 때문에 존재한다.
- 너가 뭘 중요시하느냐에 따라 선택이 달라져.
- 현실에서는 UTF-8이 거의 표준처럼 쓰이고 있고,
- 시스템 내부에서는 UTF-16, 특수한 경우에 UTF-32도 활용돼.
좋아 그러면 유니코드와 인코딩에 대해서 다시 한번 정리해줘
🔷 유니코드와 인코딩의 관계
✅ 유니코드 = 문자들의 "번호표"
- "가"는 U+AC00
- "A"는 U+0041
- "🐱"는 U+1F431
이렇게 **각 문자마다 고유한 번호(코드 포인트)**를 부여한 국제 문자 표준
✅ UTF-8 / UTF-16 / UTF-32 = 인코딩 방식
- 유니코드의 코드 포인트를 바이트로 바꾸는 규칙.
예를 들어:
- "가" → U+AC00
- UTF-8로 인코딩하면: EA B0 80 (3바이트)
- UTF-16으로 인코딩하면: AC 00 (2바이트)
- UTF-32로 인코딩하면: 00 00 AC 00 (4바이트)
즉, 같은 유니코드 문자라도 인코딩 방식에 따라 실제 저장 방식은 다름
🔷 정리 그림
[문자] → [유니코드 코드포인트] → [인코딩 방식에 따라 바이트화]
"가" → U+AC00 → UTF-8: EA B0 80
→ UTF-16: AC 00
→ UTF-32: 00 00 AC 00
✅ 요약
| 항목 | 역할 |
| 유니코드 | 전 세계 문자에 고유한 번호를 부여한 표준 (문자 집합) |
| UTF-8, UTF-16 등 | 그 번호(코드 포인트)를 컴퓨터가 저장하고 전송할 수 있게 바이트로 바꾸는 방법 (인코딩 방식) |
그런데 아까 UTF8이 ASCII와 완벽히 호환된다고 했는데 그게 무슨 의미야?
🔷 ASCII란?
- ASCII는 영어 알파벳, 숫자, 일부 특수문자 등 총 128개 문자를 7비트(1바이트 안에서 7비트만 사용)로 표현한 문자 인코딩 방식.
- 예를 들어, 대문자 'A'는 ASCII에서 0x41 (16진수), 즉 01000001 (2진수)로 표현.
🔷 UTF-8과 ASCII의 관계
- UTF-8도 ASCII 코드 범위(0x000x7F, 즉 0127까지)는 1바이트로 똑같이 표현.
- 즉, ASCII 문자들은 UTF-8에서도 바이트 값이 완전히 동일.
그래서 무슨 뜻이냐면?
- 기존 ASCII로 작성된 텍스트 파일이나 데이터는 그대로 UTF-8 인코딩된 파일에서도 동일하게 읽히고 해석된다는 뜻.
- 즉, UTF-8은 "ASCII를 완벽히 포함(inclusive)하면서, 추가로 유니코드 문자도 표현 가능하게 확장된" 인코딩 방식임.
🔷 예시
| 문자 | ASCII (7비트) | UTF-8 (1바이트) | 설명 |
| A | 0x41 | 0x41 | 완전히 동일 |
| 1 | 0x31 | 0x31 | 완전히 동일 |
| 공 | - | 0xEA 0xB3 0xB5 | 3바이트로 인코딩됨 |
🔷 왜 중요할까?
- 과거 ASCII 기반 시스템이나 프로그램을 UTF-8로 바꾸어도, 영어 문자 부분은 전혀 깨지지 않고 그대로 유지됨.
- 점진적으로 유니코드 문자(한글, 이모지 등)를 추가해도 기존 ASCII 데이터와 완전 호환 가능하니까, 시스템 업그레이드할 때 매우 편리함.
✅ 정리
- UTF-8은 ASCII 문자(0~127)를 1바이트 그대로 표현해서 ASCII와 완벽 호환!
- ASCII 문자들은 UTF-8 파일에서 똑같은 바이트 값으로 저장되고 읽힌다.
- 그래서 영어권 프로그램이나 텍스트가 UTF-8로도 문제없이 동작하는 것.
'CS' 카테고리의 다른 글
| 더티 플래그 (Dirty Flag) (0) | 2025.08.08 |
|---|---|
| ANSI (1) | 2025.07.22 |
| 코드 컨벤션 (Code onvention) (0) | 2025.07.07 |
| .NET (0) | 2025.07.07 |
| C# (0) | 2025.07.07 |