UTF encoding 발표자료

Download Report

Transcript UTF encoding 발표자료

UTF ENCODING
(UTF-8,16,32)
발표자 - 김규호
차례
•
•
•
•
•
•
•
UTF Encoding ?
유니코드 Character Set
유니코드 인코딩
UTF-8, 16
ICONV
인코딩 API - c, java
참고자료
• UTF Encoding ?
UTF-8
유니코드
( UCS-2, UCS4 )
UTF-16
UTF-32
유니코드의 Character Set
• UCS-2(Universal Character Set 2)
– 2Byte Character Set
– 1개의 언어판 (BMP)을 정의
– 1개의 언어판 = 65536개의 코드 묶음
0
0
0
0
F
F
F
F
• UCS-4(Universal Character Set 4)
– 4Byte Chracter Set
– 32,768 언어판 정의
BMP ( Basic Multilingual plane )
왜 인코딩이 필요한가?
 UCS-2,4 는
 유니코드를 저장하는 변수의 크기를 정의
 But, 바이트 순서에 대해서 표준화하지 못했음.
 파일처리 프로그램들이 바이트 단위로 동작
 UCS와는 잘 맞지 않음
 즉, 파일을 인식 시 이 파일이 UCS-2,UCS-4인
지 인식하고 각 경우를 구분해서 모두 다르게 구
현해야 하는 문제 발생
We Need
Suitable external encoding of Unicode
5
0 0 0 0 0 0 0 0
0
0
0 0 1 1 0 0 0 0
3
0
0 0 1 1 0 0 0 0
3
0
0 0 0 0 0 0 0 0
0
A
0
??
유니코드 인코딩(UTF)
• UTF(Unicode Transformation Format)
• UTF-8(in web)
– MIN: 8bit, MAX: 32bit(1 Byte * 4)
• UTF-16(in windows, java)
– MIN: 16bit, MAX: 32bit(2 Byte * 2)
• UTF-32(in unix)
– MIN: 32bit, MAX: 32bit(4 Byte * 1)
UTF-8 장점 & 단점
• 장점
– 하위 호환성(ASCII) – 하위8비트가 ascii 코드와
동일
– XML문서의 표준 인코딩
– 모든 유니코드 문자 표현 가능
– 미리 바이트 크기를 알 수 있다.
– 간단한 비트 연산만 사용해서 효율적
• 단점
– 크기가 크다.(가변적 인코딩) 1 ~ 4 byte
– 문자열 처리가 간단하지 않다.
UTF-8
코드범위
UTF-8
000000-00007F
1Byte
0xxxxxxx
000080-0007FF
2Byte
110xxxxx
10xxxxxx
000800-00FFFF
3Byte
1110xxxx
10xxxxxx
10xxxxxx
010000-10FFFF
4Byte
11110zzz
10zzxxxx
10xxxxxx
10xxxxxx
설
명
ASCII와 동일한 범위
(MSB = 0)
첫 바이트는 ‘1’로 그 문자를
표시하는데 필요한 바이트 수
결정
110(2Byte) or 1110(3바이트)
나머지 바이트들의
상위 비트는 10
UTF-16 surrogate 영역
나머진 동일
1 1 0 0 0 1 1 1
C
7
0 0 0 0 0 1 0 0
0
4
0 0 0 0 1 0 0 0
0
8
1 1 0 0 0 1 1 1
C
7
1 1 1 1 1 1 1 1
F
F
0 0 0 0 0 0 0 0
0
0
0 0 0 0 0 1 0 0
0
4
1 1 1 1 1 1 1 1
F
F
UTF-8
설
000000-00007F
1Byte
0xxxxxxx
ASCII와 동일한 범위
(MSB = 0)
000080-0007FF
2Byte
110xxxxx
10xxxxxx
000800-00FFFF
3Byte
1110xxxx
10xxxxxx
10xxxxxx
첫 바이트는 ‘1’로 그 문자
를 표시하는데 필요한 바이
트 수 결정
110(2Byte) or 1110(3바이
트)
010000-10FFFF
4Byte
11110zzz
10zzxxxx
10xxxxxx
10xxxxxx
코드범위
명
나머지 바이트들의
상위 비트는 10
UTF-16 surrogate 영역
나머지는 동일
2진수로 표현
C704 =
1100 0111 0000 0100
 뒤 에서부터 6자리씩 끊어서 표기
1100
011100 000100
첫 바이트는 ‘1’로 그 문자를 표시하는데 필요한 바이트 수 결정
Ex) 110(2Byte) or 1110(3바이트)
나머지 바이트들의 상위 비트는 10
11101100 10 011100 10 000100
16진수로 표시
EC 9C 84
 Unicode ‘위’ C704 는
UTF-8 EC 9C 84 로 인코딩 됨
`
Uni-Searcher Site
http://www.isthisthingon.org/unicode/index.phtml
UTF-16
• 인코딩의 기본 단위는 16비트, 즉 2바이트
• 기본 언어판(BMP) 2Byte 인코딩
– 63,488개 (= 65,536 – 2,048) 문자 표현 가능
– 대행문자 영역 2,048개를 제외한 BMP 63,488개의 코드를 문자
로 사용. ucs-2와 동일
• 보충 언어판(SMP) 4Byte 인코딩
– U+10000 ~ U+10FFFF : 100만여개(1,048,576개)
– 대행문자(surrogate) 영역 2개의 16-bit 쌍을 이용
• 16개 SMP 언어판 코드(1,048,576개 문자) 표현 가능
– Surrogate <High, Low> : 1024*1024
• High Surrogate : U+D800 ~ U+DBFF
• Low Surrogate : U+DC00 ~ U+DFFF
UTF-16 인코딩 방법
내
용
UTF-8
UTF-16
yyyyyyyy xxxxxxxx
UTF-16BE
(Big Edian)
yyyyyyyy xxxxxxxx
UTF-16LE
(Little Edian)
xxxxxxxx yyyyyyyy
High Surrogate
110110ZZ ZZxxxxxx
Low Surrogate
110111yy yyyyyyyy
보충 언어판
UTF-16
00000000 000zzzzz
xxxxxxyy yyyyyyyy
* ZZZZ = zzzzz-1
Iconv
• Iconv
– 유닉스 계열의 OS에서, 캐릭터 encoding 을
하는데 쓰이는 표준화된 API
Iconv
• IconV
– ex) # iconv -f EUC-KR -t UTF-8 -o 다른파일
명 원본파일명
– 입/출력 형식 지정:
• -f, --from-code=<이름> 원 문서 인코딩
• -t, --to-code=<이름> 출력 인코딩
– 출력 조정:
• -o, --output=FILE 출력 파일
Iconv
• PHP 에서 사용할때
• string iconv ( string $in_charset , string $out_charset , string $str )
•
인코딩 API
• 유니코드와 ANSI 문자열간의 변환을 위해
– MultiByteToWideChar : 멀티바이트 문자열을 유니코드로 변환하기
– WideCharToMultiByte : 유니코드 문자열을 멀티바이트 문자열로 변환
ANSI(MultiByte) -> UCS-2(WideChar) -> UTF-8(MultiByte)
인코딩 API
• int WideCharToMultiByte{
UINT CodePage,
// code page
DWORD dwFlags,
// performance and mapping flags
LPCWSTR lpWideCharStr,
// wide-character string
Int cchWideChar,
// number of chars in string
LPSTR lpMultiByteStr,
// buffer for new string
Int cbMultiByte,
// size of buffer
LPCSTR lpDefaultChar,
// default for unmappable chars
LPBOOL lpUsedDefaultChar // set when default char used
• };
Code Page에는 CP_ACP (ANSI코드), CP_UTF8 등이 올수 있다
ANSI(MultiByte) -> UCS-2(WideChar) -> UTF-8(MultiByte)
인코딩 API
• Int MultiByteToWideChar{
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
Int cbMultiByte,
LPWSTR lpWideCharStr,
Int cchWideChar,
• };
// code page
// performance and mapping flags
// 변환할 MultiByte String
// 변환할 MultiByte String 크기
// buffer for new string
// size of buffer
Code Page에는 CP_ACP (ANSI코드), CP_UTF8 등이 올수 있다
ANSI(MultiByte) -> UCS-2(WideChar) -> UTF-8(MultiByte)
인코딩 API
• ANSI To UTF8
– ANSI(MultiByte) -> UCS-2(WideChar) -> UTF-8(MultiByte)
– 따라서 WideCharToMultiByte 함수를 호출할 때 첫 번째 인자로
CP_UTF8을 지정하면 된다
인코딩 API
• 자바
– getByte 함수 사용
– String.getByte(argument)
캐릭터셋
설명
US-ASCII
7비트 ASCII
ISO-8859-1
ISO LATIN 알파벳
UTF-8
8비트 UCS 형식
UTF-16BE
16비트 UCS 형식, 빅인디언
UTF-16LE
16비트 UCS 형식, 리틀인디
언
UTF-16
16비트 UCS 변환형식, 옵션
의 바이트 순서대로
인코딩 API
• 예제
참고자료
•
•
•
•
•
•
http://cafe.naver.com/q69.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=44522
http://ko.wikipedia.org/wiki/UTF-8
http://ko.wikipedia.org/wiki/UTF-16BE
http://wiki.kldp.org/Translations/html/UTF8-Unicode-KLDP/UTF8-Unicode-KLDP-7.html
http://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8_%EC%88%9C%EC%8
4%9C_%ED%91%9C%EC%8B%9D
http://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
감사합니다