TL;DR

  • UTF-8은 μœ λ‹ˆμ½”λ“œ 슀칼라 κ°’(= surrogate code point μ œμ™Έ)을 1~4λ°”μ΄νŠΈ κ°€λ³€ 길이둜 μΈμ½”λ”©ν•˜λŠ” 방식이닀.
  • ASCII(0~127)와 μ™„μ „ ν˜Έν™˜λ˜λ©°, μ›Ήμ˜ 사싀상 ν‘œμ€€ 인코딩이닀.

UTF-8

μœ λ‹ˆμ½”λ“œμ™€ UTF-8의 관계

λ‘˜μ€ μ„œλ‘œ λ‹€λ₯Έ λ ˆμ΄μ–΄λ‹€:

μ—­ν• λΉ„μœ 
μœ λ‹ˆμ½”λ“œμ „ 세계 λ¬Έμžμ— 고유 번호(μ½”λ“œ 포인트)λ₯Ό λΆ€μ—¬ν•˜λŠ” λ²ˆν˜Έν‘œμ „ν™”λ²ˆν˜ΈλΆ€
UTF-8κ·Έ 번호λ₯Ό μ‹€μ œ λ°”μ΄νŠΈλ‘œ μ €μž₯Β·μ „μ†‘ν•˜λŠ” λ°©μ‹μ „ν™”λ²ˆν˜Έλ₯Ό 쒅이에 μ λŠ” 방법
'A'  β†’ U+0041  (μœ λ‹ˆμ½”λ“œ 번호)  β†’ 0x41              (UTF-8 λ°”μ΄νŠΈ)
'κ°€' β†’ U+AC00  (μœ λ‹ˆμ½”λ“œ 번호)  β†’ 0xEA 0xB0 0x80    (UTF-8 λ°”μ΄νŠΈ)
'πŸ˜€' β†’ U+1F600 (μœ λ‹ˆμ½”λ“œ 번호)  β†’ 0xF0 0x9F 0x98 0x80 (UTF-8 λ°”μ΄νŠΈ)

μœ λ‹ˆμ½”λ“œ 인코딩 λ°©μ‹μ—λŠ” UTF-8 외에도 UTF-16, UTF-32κ°€ μžˆμ§€λ§Œ, UTF-8이 μ›ΉΒ·νŒŒμΌΒ·ν”„λ‘œν† μ½œμ˜ 사싀상 ν‘œμ€€μ΄λ‹€.


κ°€λ³€ 길이 인코딩

λͺ¨λ“  문자λ₯Ό 4λ°”μ΄νŠΈλ‘œ μ €μž₯ν•˜λ©΄ κ°„λ‹¨ν•˜μ§€λ§Œ, μ˜μ–΄ A(번호 65)에 4λ°”μ΄νŠΈλŠ” λ‚­λΉ„λ‹€. UTF-8은 μž‘μ€ λ²ˆν˜ΈλŠ” 적은 λ°”μ΄νŠΈ, 큰 λ²ˆν˜ΈλŠ” λ§Žμ€ λ°”μ΄νŠΈ λ₯Ό μ‚¬μš©ν•œλ‹€:

μœ λ‹ˆμ½”λ“œ λ²”μœ„10μ§„μˆ˜ λ²”μœ„λ°”μ΄νŠΈ μˆ˜λŒ€μƒ 문자
U+0000 ~ U+007F0 ~ 1271λ°”μ΄νŠΈμ˜μ–΄, 숫자, ASCII 전체
U+0080 ~ U+07FF128 ~ 2,0472λ°”μ΄νŠΈμœ λŸ½ μ•…μ„ΌνŠΈ 문자 (Γ±, ΓΌ, Γ© λ“±)
U+0800 ~ U+FFFF2,048 ~ 65,5353λ°”μ΄νŠΈν•œκΈ€, 쀑ꡭ어, 일본어 λŒ€λΆ€λΆ„ (단, U+D800~U+DFFF surrogate μ œμ™Έ)
U+10000 ~ U+10FFFF65,536 ~ 1,114,1114λ°”μ΄νŠΈμ΄λͺ¨μ§€, κ³ λŒ€ 문자

λ°”μ΄νŠΈ νŒ¨ν„΄

νŒŒμ„œκ°€ β€œμ΄ λ°”μ΄νŠΈκ°€ λͺ‡ λ°”μ΄νŠΈμ§œλ¦¬ 문자의 μ‹œμž‘μΈμ§€β€ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄, 각 λ°”μ΄νŠΈ μ•žμ— ν‘œμ‹μ„ λ‘”λ‹€:

λ°”μ΄νŠΈ 수첫 λ°”μ΄νŠΈμ΄μ–΄μ§€λŠ” λ°”μ΄νŠΈλ°μ΄ν„° λΉ„νŠΈ
10xxxxxxxβ€”7λΉ„νŠΈ
2110xxxxx10xxxxxx11λΉ„νŠΈ
31110xxxx10xxxxxx Γ— 216λΉ„νŠΈ
411110xxx10xxxxxx Γ— 321λΉ„νŠΈ

κ·œμΉ™:

  • 첫 λ°”μ΄νŠΈμ˜ μ„ ν–‰ 1의 개수 = 총 λ°”μ΄νŠΈ 수 (1λ°”μ΄νŠΈλŠ” 0으둜 μ‹œμž‘ν•˜μ—¬ μ˜ˆμ™Έ)
  • μ΄μ–΄μ§€λŠ” λ°”μ΄νŠΈλŠ” 항상 10으둜 μ‹œμž‘ β†’ β€œμ€‘κ°„ λ°”μ΄νŠΈβ€λΌλŠ” ν‘œμ‹œ
  • 이 섀계 덕뢄에 λ°”μ΄νŠΈ 슀트림 쀑간뢀터 읽어도 문자 경계λ₯Ό 찾을 수 μžˆλ‹€ (자기 동기화, self-synchronizing)

인코딩 μ˜ˆμ‹œ: ν•œκΈ€ β€˜κ°€β€™

1. μœ λ‹ˆμ½”λ“œ: 'κ°€' = U+AC00 = 44032
   (hex→10진: A×16³ + C×16² = 10×4096 + 12×256 = 40960 + 3072 = 44032)
2. 44032λŠ” U+0800~U+FFFF β†’ 3λ°”μ΄νŠΈ νŒ¨ν„΄ μ‚¬μš©
3. 44032λ₯Ό 2μ§„μˆ˜λ‘œ: 1010 1100 0000 0000
4. 3λ°”μ΄νŠΈ νŒ¨ν„΄μ— μ±„μš°κΈ°:
   1110[1010] 10[110000] 10[000000]
   = 0xEA      0xB0       0x80
   (κ²€μ‚°: 0xEA = 14Γ—16+10 = 234, 0xB0 = 11Γ—16 = 176, 0x80 = 8Γ—16 = 128)
5. κ²°κ³Ό: 'κ°€' = 0xEA 0xB0 0x80 (3λ°”μ΄νŠΈ)

16μ§„μˆ˜ μ½λŠ” 법

  • 0x와 U+λŠ” λͺ¨λ‘ β€œμ΄ μˆ«μžλŠ” 16μ§„μˆ˜β€λΌλŠ” 접두어닀.
  • ν•œ μžλ¦¬κ°€ 4λΉ„νŠΈ(0F = 015)λ₯Ό ν‘œν˜„ν•˜λ―€λ‘œ λ°”μ΄νŠΈ(8λΉ„νŠΈ) = hex 2자리.
  • 10μ§„μˆ˜ λ³€ν™˜: 각 자리 Γ— 16의 κ±°λ“­μ œκ³±μ„ ν•©μ‚° (예: 0x41 = 4Γ—16 + 1 = 65).

인코딩 μ˜ˆμ‹œ: 이λͺ¨μ§€ β€™πŸ˜€β€˜

1. μœ λ‹ˆμ½”λ“œ: 'πŸ˜€' = U+1F600 = 128512
2. 128512λŠ” U+10000~ β†’ 4λ°”μ΄νŠΈ νŒ¨ν„΄ μ‚¬μš©
3. 128512λ₯Ό 2μ§„μˆ˜λ‘œ: 0 0001 1111 0110 0000 0000
4. 4λ°”μ΄νŠΈ νŒ¨ν„΄μ— μ±„μš°κΈ°:
   11110[000] 10[011111] 10[011000] 10[000000]
   = 0xF0      0x9F       0x98       0x80
5. κ²°κ³Ό: 'πŸ˜€' = 0xF0 0x9F 0x98 0x80 (4λ°”μ΄νŠΈ)

ASCII μ™„μ „ ν˜Έν™˜

UTF-8의 1λ°”μ΄νŠΈ μ˜μ—­(U+0000~U+007F)은 ASCII와 λ°”μ΄νŠΈ 값이 λ™μΌν•˜λ‹€:

'A' = ASCII 0x41 = UTF-8 0x41
'\n' = ASCII 0x0A = UTF-8 0x0A
  • ASCII둜 μž‘μ„±λœ νŒŒμΌμ€ μˆ˜μ • 없이 μœ νš¨ν•œ UTF-8이닀
  • HTTP 헀더, JSON ν‚€μ›Œλ“œ λ“± ASCII 기반 ν”„λ‘œν† μ½œμ΄ UTF-8 ν™˜κ²½μ—μ„œ κ·ΈλŒ€λ‘œ λ™μž‘ν•œλ‹€
  • ν˜Έν™˜μ„±μ΄ UTF-8이 사싀상 ν‘œμ€€μ΄ 된 결정적 μ΄μœ λ‹€

μ™œ UTF-8이 ν‘œμ€€μ΄ λ˜μ—ˆλ‚˜

λŒ€μ•ˆλ‹¨μ UTF-8의 μž₯점
ν™•μž₯ ASCII (CP949 λ“±)256자 ν•œκ³„, μΈμ½”λ”©λ§ˆλ‹€ λ§€ν•‘ 닀름 β†’ 깨짐14만자+ 톡합, 단일 ν‘œμ€€
UTF-16ASCII 쀑심 ν…μŠ€νŠΈμ—μ„œ λΉ„νš¨μœ¨μ , λ°”μ΄νŠΈ μˆœμ„œ 이슈둜 BOM(Byte Order Mark) λ˜λŠ” LE(λ¦¬ν‹€μ—”λ””μ•ˆ)/BE(λΉ…μ—”λ””μ•ˆ) λͺ…μ‹œ ν•„μš”byte-oriented라 λ°”μ΄νŠΈ μˆœμ„œ 문제 μ—†μŒ
UTF-32λͺ¨λ“  문자 4λ°”μ΄νŠΈ β†’ 곡간 λ‚­λΉ„κ°€λ³€ 길이둜 효율적

Connections

  • ASCII (American Standard Code for Information Interchange) β€” UTF-8의 1λ°”μ΄νŠΈ μ˜μ—­(0~127)이 ASCII와 동일, μ™„μ „ν•œ ν•˜μœ„ ν˜Έν™˜
  • Base64 인코딩 β€” Base64λŠ” λ°”μ΄λ„ˆλ¦¬λ₯Ό ASCII μ•ˆμ „ 문자둜 λ³€ν™˜. UTF-8 ν…μŠ€νŠΈλ„ λ°”μ΄λ„ˆλ¦¬λ‘œ μ·¨κΈ‰ν•˜μ—¬ Base64 인코딩 κ°€λŠ₯

Source Trail

  • 원본: μœ„ν‚€λ°±κ³Ό β€” UTF-8
  • 기반 ν‘œμ€€: RFC 3629 (UTF-8)
  • κ΄€λ ¨ ν‘œμ€€: Unicode Standard (μœ λ‹ˆμ½”λ“œ 번호 체계)