본문 바로가기

프로그래밍/CS

문자의 표현 - Character Set

ASCII(American National Standards Institute)

  • 미국 국가 표준 협회(ANSI)에서 정의한 문자 인코딩 규칙
  • 7bit => 2^7 = 128개 문자 표현 가능
  • 영어 알파벳, 숫자, 특수 문자 등
  • 약 90여 개의 문자에 코드값(2진수) 정의

ISO-8859-1 (ISO-Latin-1)

  • HTML 문서의 기본 인코딩
  • 8bit => 2^8 = 256개 문자 표현 가능
  • ASCII + 서유럽 문자(네덜란드어, 노르웨이어, 덴마크어, 독일어, 로망슈어, 스웨덴어 등..)
  • 약 200여 개의 문자에 코드값(2진수) 정의

EUC-KR

  • 16bit => 2^16
  • 한글 음절 한 개에 대해 인코딩 규칙을 정의한 완성형 인코딩 규칙 -> 2바이트 코드값
    • 가 -> 1011 0000 1010 0001 (0xB0A1)
...
0xB0A1 0xB6CA   0xB6CA X X X 0xB6CB
  • 표현하지 못하는 문자가 존재

조합형

  • 2바이트 16bit : 한글(1bit) + 초성(5bit) + 중성(5bit) + 종성(5bit)
  • '녁' -> 0x 1001 0001 0110 0010 (9162)
  • 65536개의 코드 중에서 절반을 한글에 사용 -> 국제 표준 X HWP에서만 사용

MS949

  • EUC-KR + @
  • Windows 95 이상 부터 지원한 MS에서 만든 언어 코드 (국제 표준)
  • 기존의 EUC-KR에 문자 코드를 추가했기 때문에 정렬할 때 문제 발생
    • 똘똠똡똥(b6ca 8c63 8c64 b6cb)  --정렬--> 똠똡똘똥
...
0xB0A1 0xB6CA   0xB6CA 0x8C63 0x8C64 0x8C645 0xB6CB

 


Unicode

  • 전 세계의 모든 문자를 컴퓨터에서 일관되게 처리할 목적으로 정의된 산업 표준 규칙
  • 유니코드는 '문자를 2진수로 표현(인코딩; encoding)'할 때, 두 가지 방식(UCS UTF)을 사용
  • 자바는 메모리에 문자를 저장할 때는 'UCS(국제 문제 집합)'를 사용하고, 외부로 입출력 할 때는 'UTF'를 사용

UCS(Universal Coded Character Set; 국제 문자 집합)

  • 'ISO 10646' 표준을 가리키는 이름
  • 110만개 이상의 문자에 대해 코드 값 정의
  • 0 ~ 65535 까지의 코드가 주로 사용되며, 보통 'USC-2'라 부름. 즉, 2바이트 범위에서 정의한 유니코드라는 의미.
  • 자바가 사용하는 유니코드가 'UCS-2'

UTF(UCS Transformation Format)

  • 문자를 1바이트 코드 값으로 저장하는 기존 시스템에서 UCS를 사용하기 위해 만든 문자 인코딩 방식이다.
  • UTF-8, UTF-16, UTF-32가 있으며 주로 UTF-8이 사용된다.
코드 범위(십육진법) UTF-16BE 표현(이진법) UTF-8 표현(이진법) 설명
000000-00007F 00000000 0xxxxxxx 0xxxxxxx ASCII와 동일한 범위
000080-0007FF 00000xxx xxxxxxxx 110xxxxx 10xxxxxx 첫 바이트는 110 또는 1110으로 시작하고,
나머지 바이트들은 10으로 시작함
000800-00FFFF xxxxxxxx xxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 110110yy yyxxxxxx 110111xx xxxxxxxx 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx UTF-16 서러게이트 쌍 영역 (yyyy = zzzzz - 1).
UTF-8로 표시된 비트 패턴은 실제 코드 포인트와 동일하다.

UTF-8

  • UCS의 코드 값 중 00 ~ 7F(127개)까지 ASCII에 해당하는 UCS 코드(영어)는 그대로 1바이트로 표현
  • 기존 시스템을 변경하지 않고 유니코드를 사용할 수 있도록 하기 위해 UTF-8이 만들어짐
  • 그 외의 문자 코드는 규칙에 따라 2바이트 ~ 4바이트까지 변환하여 표현 (한글은 3바이트)
  • 대부분의 시스템에서 데이터 입출력 할 때 UTF-8을 사용한다.
  • 자바에서도 데이터 입출력할 때 주로 UTF-8을 사용하고 있다.

UTF-16

  • UCS-2의 코드 값은 그대로 2바이트로 표현하며, ASCII 코드도 UCS-2와 동일하게 2바이트로 표현
  • 따라서 UCS-2의 코드 값을 표현할 때는 UCS-2와 같다. 
  • UCS-2와 다른 점은 UCS-2의 범위를 벗어나는 문자 코드 값도 표현할 수 있으며,
  • UCS-2를 벗어나는 유니코드는 무조건 4바이트로 변환함

UTF-32

  • UCS-4의 4바이트 코드 값을 그대로 표현
  • 즉 UTF-32는 UCS-4와 같음
  • 모든 문자를 4바이트 코드 값으로 표현하기 때문에 메모리 낭비가 심함