23
Unicode & Encoding JaeSang Yoo [email protected]

Unicode & encoding

Embed Size (px)

Citation preview

Page 1: Unicode & encoding

Unicode & EncodingJaeSang Yoo

[email protected]

Page 2: Unicode & encoding

주의!• 각 표준의 배경이 실제 역사적 사실과 다소 다를 수 있음문제가 된 부분은 아마 비슷할 것임

• 완벽하게 모든 유니코드에 대하여 설명하는 것이 아님

• 내부 구동 원리가 다소 다를 수 있음

• 실제 원리까지 자세하게 써 있지 않음개략적인 이론으로 빠른 이해를 목적으로 함

Page 3: Unicode & encoding

C언어 배울 적에…• 문자열을 배울 때, string == array of characters

• 영어는 1 Byte, 한글은 2 Byte라고 했다.

• 생각보다 실생활에서 바로 볼 수 있다.

구글에 “한글 300자 영어” 검색 결과 반각 / 전각 글자의 표현

Page 4: Unicode & encoding

그럼 이건 될까?

• char a = ‘한’; // 1 Byte 공간에 한글 한 글자 초기화

• printf(“%c”, ‘글’); // 기존의 한 글자 출력에 한글 출력

• scanf(“%c”, &a); // 한글 한 글자 입력

Page 5: Unicode & encoding

그래서 돌려봤다!

• Debug / Release 둘 다 안됨

• 글자 초기화도 안 되고

• 출력도 제대로 안 되고

• 입력도 제대로 안 되고

• 하나도 안되네?

Page 6: Unicode & encoding

ASCII?• ASCII (American Standard Code for Information Interchange)

• 알파벳

• 대/소문자

• 숫자, 기호

• 제어 코드

• 사실 7 bit?

Page 7: Unicode & encoding

ASCII• American Standard Code for Information Interchange

• 영어 & 숫자 & 기호 정도만 표현하면 충분하지!

• 7 Bit = 128개 정도면 내가 쓰고 싶은거 다 쓰는데?

• 1 Bit 는 Parity bit로 써서 오류 확인하자!

• 7 + 1 = 8 Bit = 1 Byte 라고 부르자! (진짜 설득력 있는 가설임!)

Page 8: Unicode & encoding

한편 유럽에서는…• ASCII로는 부족한데?

• Diacritic을 표현 못 한다!ex. à, á, â, ä, è, ê, ç, č…

• 화폐 단위는 $만 있는 게 아니다!ex. £, €, ₣, !…

• 모양이 완전 다른 언어는?ex. Θ, Δ, Ω, φ, ß…

Page 9: Unicode & encoding

Extended ASCII• ASCII는 7 Bit면 충분하니깐, 나머지 1 Bit를 더 쓰면

128개 글자를 더 표현할 수 있다!

• 기호도 더 추가하자!

• 하지만 빠진 언어도 있음.

• 그리스 문자 (수식 기호 외)

• 키릴 문자 (러시아어)

Page 10: Unicode & encoding

Extended ASCII• 확장을 시켜도, 유럽의 모든 언어를 표현할 수 없더라.

• 우린 따로 쓰겠다!

• 그럼 지역마다 다른 표준으로!

• ISO/IEC-8859 Part 1 : Western European Part 2 : Central European Part 5 : Latin / Cyrillic

러시아 키릴자모 ASCII

Page 11: Unicode & encoding

한 / 중 / 일 은?• 한글 : 초성+중성+종성 → 14*10*14 = 1960

(단순하게 계산한 것, 사실 훨씬 많음)

• 중국어 : 간체만 2200여개

• 일본어 : 가나 100개 + 보조 한자

• 1 Byte = 256 으로는 부족하다!

Page 12: Unicode & encoding

그래서! 2 Byte로 간다!• 2 Byte = 16 Bit = 65536

• 그런데, 영어는 1 Byte (사실 7 Bit)로도 충분한데?

• ASCII에서 남는 1 Bit (Parity)로 2 Byte 확장인지 확인

• 0000 0000 ~ 0111 1111 까지는 ASCII 기반

• 1000 0000 0000 0000 ~ 1111 1111 1111 1111은 각 나라 언어 (한글 / 한자 / 가나)에 할당

Page 13: Unicode & encoding

한글 표현하기• 한글 : 조합 형 글자 (초성 + 중성 + 종성)

• 완성형 : 자주 사용되는 한글 글자를 미리 조합해서 표현 한글 2350자 & 한자 4884자 & 등등… 강 = 0xB041 ≠ ㄱ + ㅏ + ㅇ

• 조합형 : 각 초성, 중성, 종성을 모두 표시 강 = 1 ????? ????? ????? = ㄱ + ㅏ + ㅇ 초성 중성 종성

Page 14: Unicode & encoding

EUC-KR

• Extended Unix Code - Korean

• 8 Bit 완성형 기반 인코딩

• 0??? ???? 는 KS X 1003 기반 (ASCII에서 \ ₩ 차이)

• 1??? ???? 는 KS X 1001 기반 (한글, 한자 표기)

Page 15: Unicode & encoding

CP 949• Code Page 949

• Code Page: OS에서 선택한 Character Code들을 특정 순서로 정리해 놓은 목록

• 완성형 확장 인코딩

• EUC-KR에 없는 한글 8822자 추가

• Windows에서 한글 표기에 사용

Page 16: Unicode & encoding

그런데…• 언어 표기 표준을 만들 때, 서로 다른 나라는 고려 안한다.

• 프로그램 / 문서 / 데이터를 공유할 줄 몰랐지…

• 그래서 이런 사태가 벌어진다!

• 심지어 \ ₩ ¥ 셋 다 같은 키 코드

Page 17: Unicode & encoding

그것 때문에!

• 매번 CP를 변경해야 함!

• 2개 언어 (영어 제외) 동시 표현 불가

• 뭔가 대책이 필요하다!

Page 18: Unicode & encoding

Unicode

• Unique Character Code!

• 모든 글자에 고유 키값을 주자!

• 세계 모든 언어를 출력할 수 있다!

• U+????로 표기

Page 19: Unicode & encoding

Unicode는 몇 Byte인가?• BMP (Basic Multilingual Plane)

2 Byte = 65536 개에 표현가능한 기본 유니코드실제 44194개 글자가 정의되어 있음

• 한문은 추가해야 할 것만 44944개인데?

• 확장 해야지 뭐…

• 4 Byte = 4294967296 개 글자 표현 가능

Page 20: Unicode & encoding

Unicode 인코딩

• UTF-3232 Bit 고정 길이로 각각 언어 표현

• UTF-162 Byte 내로 표현 가능한 범위는 2 Byte로4 Byte 로 표현해야 하는 경우에는 4 Byte로

Page 21: Unicode & encoding

UTF-8

• 고정 길이로 했더니…‘A’ = U+0041의 앞에 0x00 == NULL

• 공간 낭비도 심하고…

• 가변 길이로, U+00??는 1 Byte로 표현하자!

Page 22: Unicode & encoding

그럼 이제부터 Unicode?• Legacy SW / File은?

• Unicode 적용하지 않은 웹사이트는?모두 다 UTF-8만 쓴다고 말한 적 있나?

• 인코딩을 뭘로 할 지 알려줘야 함

Page 23: Unicode & encoding

Reference

• http://www.slideshare.net/parkpd/unicode-4796992?qid=eb8ac92f-cf2d-4840-9371-0ff6630253e6&v=default&b=&from_search=5