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개의 코드 묶음 UCS-4(Universal Character Set 4) 4Byte Chracter Set 32,768 언어판 정의 F BMP ( Basic Multilingual plane )
Suitable external encoding of Unicode 왜 인코딩이 필요한가? UCS-2,4 는 유니코드를 저장하는 변수의 크기를 정의 But, 바이트 순서에 대해서 표준화하지 못했음. 파일처리 프로그램들이 바이트 단위로 동작 UCS와는 잘 맞지 않음 즉, 파일을 인식 시 이 파일이 UCS-2,UCS-4인지 인식하고 각 경우를 구분해서 모두 다르게 구현해야 하는 문제 발생 We Need Suitable external encoding of Unicode
1 A 3 1 3 ??
유니코드 인코딩(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 0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 11110zzz 10zzxxxx 코드범위 UTF-8 설 명 000000-00007F 1Byte 0xxxxxxx ASCII와 동일한 범위 (MSB = 0) 000080-0007FF 2Byte 110xxxxx 10xxxxxx 첫 바이트는 ‘1’로 그 문자를 표시하는데 필요한 바이트 수 결정 110(2Byte) or 1110(3바이트) 나머지 바이트들의 상위 비트는 10 000800-00FFFF 3Byte 1110xxxx 010000-10FFFF 4Byte 11110zzz 10zzxxxx UTF-16 surrogate 영역 나머진 동일
1 C 7 4
1 8 1 C 7 4 1 F
0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 11110zzz 10zzxxxx 코드범위 UTF-8 설 명 000000-00007F 1Byte 0xxxxxxx ASCII와 동일한 범위 (MSB = 0) 000080-0007FF 2Byte 110xxxxx 10xxxxxx 첫 바이트는 ‘1’로 그 문자를 표시하는데 필요한 바이트 수 결정 110(2Byte) or 1110(3바이트) 나머지 바이트들의 상위 비트는 10 000800-00FFFF 3Byte 1110xxxx 010000-10FFFF 4Byte 11110zzz 10zzxxxx UTF-16 surrogate 영역 나머지는 동일
2진수로 표현 C704 = 1100 0111 0000 0100 뒤 에서부터 6자리씩 끊어서 표기 1100 011100 000100 첫 바이트는 ‘1’로 그 문자를 표시하는데 필요한 바이트 수 결정 Ex) 110(2Byte) or 1110(3바이트) 나머지 바이트들의 상위 비트는 10 11 10 1100 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 인코딩 방법 yyyyyyyy xxxxxxxx xxxxxxxx yyyyyyyy 110110ZZ ZZxxxxxx 내 용 UTF-8 UTF-16 yyyyyyyy xxxxxxxx UTF-16BE (Big Edian) UTF-16LE (Little Edian) xxxxxxxx yyyyyyyy High Surrogate 110110ZZ ZZxxxxxx Low Surrogate 110111yy yyyyyyyy 보충 언어판 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, // code page DWORD dwFlags, // performance and mapping flags LPCSTR lpMultiByteStr, // 변환할 MultiByte String Int cbMultiByte, // 변환할 MultiByte String 크기 LPWSTR lpWideCharStr, // buffer for new string Int cchWideChar, // 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 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%84%9C_%ED%91%9C%EC%8B%9D http://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
감사합니다