1
2
최종 사용자. “ 이런 한글 깨지네.” Unicode 에 대해 전혀 모르는 개발자. UTF-8 을 쓰니 Unicode 완비되었다고 생각하는 사람. 세상에는 여러 종류의 인코딩이 존재하고 있다는 것을 아는 사람. UTF-8 이 곧 Unicode 가 아니라는 것을 아는 사람. Unicode 에 여러 평면이나 카테고리, 스크립트 등의 분류가 존재한다는 것을 알고 있다 유니코드 전문가 유니코드 이해의 다양한 단계들 by 홍민희의 블로그 3
멀티바이트 유니코드 UTF-8 BMP SBCS CP949 UTF-16 UCS2 Encoding UCS4 BOM i18n KSC5601 4
Character Set Encoding Codepage 문자의 집합. 문자에는 숫자 코드가 부여되는데, 캐릭터 셋이라 하면 컴퓨터 상에 어떻게 표현되는가 까지는 정해지지 않은 상태. 캐릭터 셋이 컴퓨터상에서 어떻게 표현되는지 까지 정해진 상태의 문자의 집합. EUC_KR, SHIFT_JIS … IBM 에서 쓰던 말. 인코딩과 같은 맥락. MS 에서 DOS 를 만들 때 IBM 과 같이 만들었는데 덕분에 MS 에서도 Codepage 라는 말을 많이 씀 5
Single Byte Character Set (SBCS) Wide Byte Character Set (WBCS) Multi Byte Character Set (MBCS) 예를 들면 1 바이트로 표현 가능한 ASCII 는 SBCS 모든 문자를 2 바이트로 표현하는 캐릭터 셋 가변 길이 캐릭터 셋. 상황에 따라 1 바이트 이상 사용. 6
ASCII 7 비트를 사용한 인코딩 33 개의 출력 불가능한 제어 문자들 95 개의 출력 가능한 문자들 7
Codepage 문자 인코딩을 위해 쓰이던 전통적인 IBM 용어 7bit 인 ASCII 에 1bit 더 붙여서 1Byte 를 다 사용함. 8
i18n l10n internationalization localization 9
i18n l10n 10
CP437 Original IBM Codepage CP860 포르투갈어 CP932 일본어 CP949 한국어 UTF-8 IBM CP1208 MS CP65001 SAP CP4110 = = = 너무 많아 !! 11
1991 년 10 월 i18n 을 위해 만들어짐. “ 이 세상의 모든 문자를 담자 ” UCS2 UCS4 일반적으로 사용. 모두 2byte 산스크리트어, 옛이집트고어 등등 포함. 12
BMP 0x0000 부터 0xFFFF 까지 BMP(Basic Multilingual Plane) 13
UCS 용 인코딩 방법으로 ISO 이 정의. 축약하여 UCS2. 각 글자들을 0~65535(0xFFFF) 에 매김. BMP 영역을 표현 가능. 한글 USC-2 영역 14
BMP 중 한글 각 0xAC01( ) 쀍 0xC00D( ) 15
UTF-8 UTF-16 1~3byte 를 사용하여 BMP 를 모두 표현 가능 BMP 를 표현하기 2byte 를 사용하여 BMP 를 모두 표현 가능 UTF-32 4byte 를 사용하여 BMP 를 모두 표현 가능 ? 16
Plane USC-4 영역 17
SMP SIP 0x10000~0x1FFFF 고대 script, 음악 및 수학 기호 BMP 외의 영역 Unassigned 그 외그 외 그 외그 외 0x30000~0xDFFFF Unassigned 0x20000~0x2FFFF CJK Unified Ideographs 0xE0000~ SSP, Private Use Area Planes 18
Scripts 스크립트의 분류 –099 Hieroglyphic and cuneiform scripts 100–199 Right-to-left alphabetic scripts 200–299 Left-to-right alphabetic scripts 300–399 Alphasyllabic scripts 400–499 Syllabic scripts 500–599 Ideographic scripts 600–699 Undeciphered scripts 700–799 Shorthands and other notations 800–899 (unassigned) 900–999 Private use, alias, special codes 000–099 Hieroglyphic and cuneiform scripts 100–199 Right-to-left alphabetic scripts 200–299 Left-to-right alphabetic scripts 300–399 Alphasyllabic scripts 400–499 Syllabic scripts 500–599 Ideographic scripts 600–699 Undeciphered scripts 700–799 Shorthands and other notations 800–899 (unassigned) 900–999 Private use, alias, special codes 19
1. 1 바이트로 표시된 문자의 최상의 비트는 항상 0 UTF 바이트 이상으로 표시된 문자의 경우, 첫 바이트의 상위 비트들이 그 문자를 표시하는 데 필요한 바이트 수를 결정한다. 예를 들어서 2 바이트는 110 으로 시작하고, 3 바이트는 1110 으로 시작 한다. 3. 첫 바이트가 아닌 나머지 바이트들은 상위 2 비트가 항상 10 이다. 4. 기존의 ASCII 로 짜여진 프로그램의 경우 UTF-8 을 사용하면 아무 문제 없이 동작 가능하다. 20
코드범위 UTF-16 표현 UTF-8 표현설명 ~00007F0xxxxxxxx0xxxxxxx ASCII 와 동일한 범위 ~0007FF 00000xxx xxxxxxxx 110xxxxx 10xxxxxx 첫바이트 110 또는 1110 로 시작 바이트 들은 10 으로 시작 ~00FFFFxxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx 첫바이트 110 또는 1110 로 시작 바이트 들은 10 으로 시작 ~10FFFF yy yyxxxxxx xx xxxxxxxx 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx UTF-16 서로게이트 쌍 영역 (yyyy = zzzzz - 1). UTF-8 로 표시된 비트 패턴은 실제 코드 포인트와 동일하다. UTF8 과 UTF16 으로 표현하기 21
000800~00FFFFxxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx 첫바이트 110 또는 1110 로 시작 바이트 들은 10 으로 시작 ‘ 삼 ’ 을 UTF-8, 16 으로 어떻게 ? UTF-16 : 0xC0BC UTF-8 : 0xC0BC = = EB 82 BC 22
UTF-16 인코딩 예제 몇가지 Z(0x7A) : 0x007A : 0x1D11E = High-Surrogate : (0xD834) Low-Surrogate : (0xDD1E) 23 코드범위 UTF-16 표 현 ~00007F0xxxxxxxx ~0007FF 00000xxx xxxxxxxx ~00FFFFxxxxxxxx ~10FFFF ZZ ZZxxxxxx yy yyyyyyyy 0x 이상의 경우 | z z z z z | x x x x x x y y | y y y y y y y y 로 나타남. (ZZZZ = zzzzz - 1) 水 (0x6C34) : 0x6C34 zzzzz : ∴ ZZZZ : xxxxxx : yyyyyyyyyy : ∴ D834 DD1E High Surrogate Low Surrogate 높은 음자리표 (0x1D11E)
CP949 to Unicode 24
Unicode to CP
BOM 유니코드에서 엔디안을 구별하기 위해 사용 되는 문자. U+FEFF EncodingRepresentation UTF-8EF BB BF UTF-16 BEFE FF UTF-16 LEFF FE UTF-8 에서는 엔디안 문제가 일어나지 않으므로 BOM 을 넣을 필요가 없지만 해당 자료가 UTF-8 인코딩이라 는 표식으로 사용하는 경우도 있다. 마이크로소프트 윈도우의 많은 문서 편집기가 UTF-8 로 저장할 경우 자동으로 문서의 앞부분에 BOM 을 추가한 다. 따라서 BOM 을 인식하지 못하는 다른 문서 편집기 에서 윈도우에서 제작한 문서를 읽어 들일 때 잘못된 처 리를 하는 경우가 종종 있다. 26
응용 – 한글 초성 검색 알고리즘 구현 boolean matchString(String 검색대상, String 검색어 ); matchString(“ 삼성소프트웨어멤버십 ”, “ ㅅㅅ소프트웨ㅇㅁ ”); -> TRUE matchString(“ 삼성소프트웨어멤버십 ”, “ ㅅㅍㅌㅇㅇ ”); -> TRUE matchString(“ 삼성소프트웨어멤버십 ”, “ 소프트웨얼 ”); -> FALSE 27
초성 검색 알고리즘 – 메소드 boolean isInitialSound(char searchar) : searchar( 문자 ) 가 자음인지 검사한다. char getInitialSound(char c) : c( 문자 ) 의 자음을 얻는다. boolean isHangul(char c) : 해당 문자가 한글인지 검사. 28
초성 검색 알고리즘 29
초성 검색 알고리즘 30
초성 검색 알고리즘 31
초성 검색 알고리즘 32
33
개발하며 겪었던 애로사항들 1. 유니코드 인코딩을 한 DLL 을 멀티바이트 프로그램에서 사용하려 할 때 : 이유도 모르고 하루를 그냥 날림. 2. 멀티바이트 프로그램에서 일본어와 중국어를 지원하기 위해 한글 윈 도우에서 일본어와 중국어를 복사 붙여넣기 하였는데, 실제 일본 윈도 우와 중국 윈도우에서 글씨가 깨져서 꿿뜛긄쳸 같은 글씨로 나옴. : CP949 에도 어느 정도 일본어, 한문을 제공한다. 이게 마치 다른 언어 윈도우에서도 보여질 것 같지만 전혀 그렇지 않다. 3. 서로 다른 기종 간에 씨리얼 통신 등으로 한글 스트링을 보냈는데 리시브 한 곳에서 보니 한글이 다 깨져있는 경우 : 이 경우는 인코딩 도 생각해 볼 수 있고 Endian 문제도 생각해 볼 수 있다. 34
하고 싶은 말 1. 어 ? 한글이 깨졌네 ? 에서 세부 내용을 아는 프로그래머로 ! 2. 프로그램을 짤 때는 i18n 을 고려하여 설계하도록 하고, 사용 인코딩 은 웬만하면 유니코드로 하도록 한다. 요새 웬만한 플랫폼은 다중언어 환경을 제공하도록 여러 리소스를 사용할 수 있도록 지원한다. 3. 라이브러리가 지원한다고 그냥 갖다 쓰기보다는 내부적으로 어떻 게 돌아가는지 호기심을 갖고 살펴보면 좋을 것 같다. 35
멀티바이트 유니코드 UTF-8 BMP SBCS CP949 UTF-16 UCS2 Encoding UCS4 BOM i18n KSC
WHQL 인증 기사 892&outlink=1 터치스크린 제어장치 특허 취득 세계화 단계별 연습 : 유니 코드 사용 유니코드 공식 홈페이지 37
38
39