CS

유니코드

khh7052 2025. 7. 10. 11:33
반응형

🔷 왜 유니코드가 필요했을까?

과거에는 각 나라나 시스템마다 문자 인코딩 방식이 달라서 서로 다른 컴퓨터 간에 문자가 깨지는 현상(문자파일 호환 문제)이 자주 발생함.

예를 들어:

  • 영어권: 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