Skip to content

Instantly share code, notes, and snippets.

@parkjinwoo
Last active February 15, 2017 07:24
Show Gist options
  • Save parkjinwoo/9d71e3411d75916ae8e4 to your computer and use it in GitHub Desktop.
Save parkjinwoo/9d71e3411d75916ae8e4 to your computer and use it in GitHub Desktop.
Unicode, UTF-8

CodePoint

  • U+0000~U+007F (ASCII)
  • U+AC00~U+D7A3 (가-힣)
  • hex(ord('a')) -> '0x61'
  • chr(int('0x61', 0)) -> 'a'
  • hex(ord('가')) -> '0xac00'
  • chr(int('0xac00', 0)) -> '가'

Unicode != UTF-8

  • U+AC00 != 0xEA B0 80

UTF-8

  • 가변 바이트 인코딩
  • Unicode Encoding 시 NULL 포함하지 않음 : C에서 strcpy() 사용 가능
  • ASCII 호환
  • 일부 바이트 유실되어도 다음 바이트를 알아낼 수 있음

Types

  • bytes/str : b'09az가힣'
  • unicode/str : u'09az가힣'

Encode / Decode

  • u'09az가힣'.encode('UTF-8') -> b'09az\xea\xb0\x80\xed\x9e\xa3'
  • b'09az\xea\xb0\x80\xed\x9e\xa3'.decode('UTF-8') -> u'09az가힣'
  • encodeURIComponent('09az가힣') -> "09az%EA%B0%80%ED%9E%A3"
  • escape('09az\xea\xb0\x80\xed\x9e\xa3') -> "09az%EA%B0%80%ED%9E%A3"

BOM

  • UTF-8 : EF BB BF
  • UTF-16 BE : FE FF
  • UTF-16 LE : FF FE

문자집합과 인코딩


  • ASCII : 7비트 문자 (American Standard Code for Information Interchange)
    U+0000 ~ U+007F(ISO 646 IRV)
  • Latin-1 : U+0000 ~ U+00FF (ISO 8859-1) Latin-1을 ASCII로 지칭되기도 한다.

  • UCS : Universal Charset Set
    110만개 중 첫 65536개만 사용 (이 영역을 BMP, Basic Multilingual Plane라 지칭)
    Plane (언어판, 면, 상. 256x256 중 65536개의 코드 묶음) - 유니코드에서는 현재 17개의 언어판 사용
  • UCS-2 : 유니코드를 2바이트로 변환 (UCS16) Unicode
    ISO 10646에 정의
    0x0000~0xFFFD 까지 사용 이를 BMP (Basic Multilingual Plane)라고 부름
    U+0000 ~ U+007F : ASCII영역 (ISO 646 IRV)
    U+0000 ~ U+00FF : Latin-1 (ISO 8859-1)
    U+E000 ~ U+F8FF 와 BMP 외부 영역은 Reserve됨
  • UCS-4 : 유니코드를 4바이트로 변환 (UCS32)
    ISO 10646에 정의

UCS는 약 20억개의 문자 코드 포인트 보유한다.

모든 문자가 가상의 테이블 안에 포함한다.
테이블들은 128개의 그룹으로 나뉜다.
한 그룹은 256개의 판(Plane)으로 나뉜다.
한 판(Plane)에는 65535개의 코드 포인트가 있다.

문자를 65535(256*256)개 모아 판(Plane)이 된다.
256개의 판(Plane)을 모으면 그룹이라 부른다.
그룹을 128개 모으면 UCS 테이블이 된다.

65535 * 256 * 128 = 약 20억

여기서 최초 65535개의 코드 포인트가 할당되는 부분을 기본 언어판(BMP, Basic Multilingual Plane)이라고 부른다.


Unicode는 UCS의 Subset이며 호환된다.
Unicode는 UCS중에 그룹 0번의 0번 면부터 16번 면까지만 사용한다.

Unicode 인코딩: Unicode에 매겨진 코드 포인트가 바이트로 어떻게 표현할 것인지를 나타낸다.

UTF-32는 코드포인트 값을 그대로 유지하면서 바이트로 표현한다.
UTF-16은 코드포인트 값을 유지하되, BMP를 벗어난 문자는 32비트로 인코딩한다.
UTF-8은 코드포인트 값에 따라 1,2,3,4 바이트로 가변 인코딩한다.


코드 포인트 비트 UTF-16BE UTF-8
000000-00007F 7 00000000 0xxxxxxx 0xxxxxxx
000080-0007FF 11 00000xxx xxxxxxxx 110xxxxx 10xxxxxx
000800-00FFFF 16 xxxxxxxx xxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 21 110110yy yyxxxxxx 110111xx xxxxxxxx 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx
  • ASCII와 동일한 범위
  • 첫 바이트는 110으로 시작하고, 나머지 바이트들은 10으로 시작함.
  • 첫 바이트는 1110으로 시작하고, 나머지 바이트들은 10으로 시작함.
  • UTF-16 서러게이트 쌍 영역 (yyyy = zzzzz - 1). UTF-8로 표시된 비트 패턴은 실제 코드 포인트와 동일함.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment