Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Unicode 이해하기
1. Unicode v 1.1 박일 http://AnDStudy.com http://parkpd.egloos.com
2.
3. 문자? 문자셋? 인코딩? 폰트? 문자는 대소문자 구별을 한다. 영어 문자는 52 개 Character Code : 문자를 표현하는 데이터값 A : 65, B : 66 in ASCII 문자셋(Character Set) : 하나의 언어권에서 사용하는 언어를 표현하기 위한 문자들의 집합 인코딩: 문자셋과Character Code 와의 mapping ASCII 도 인코딩 방법의 하나 폰트 : glyphs 집합 일본어 : MS_Gothic, MS_Minch 중국어 : SimSun, PSimsun폰트 glyphs(글리프) : 문자 표현 그림[도안] 표지, [건축]장식용 세로홈, [고고학] 그림 문자, 상형 문자 Times New Roman Bold A : A Arial Bold A : A
4. ASCII 26x2(알파벳 대소문자) + 10(숫자) + 특수문자 + 통제문자 ->128개 이하(2^7) 옛날 워드스타에서는 나머지 1 bit 를 제어용으로 사용
5. 서유럽으로 간 ASCII 움라우트 등을 표현하기 위해 7bit 에 1bit 추가 (2^8) ASCII 확장 문자셋을ISO 가 관리하게 됨 ISO/IEC 8859-1 라틴-1 서유럽 ISO/IEC 8859-2 라틴-2 중앙유럽 부터... ISO/IEC 8859-16 라틴-10 남동유럽 까지
6. 일본으로 간 문자셋 1바이트로 일본어를 표현하기 글자가 둥글어 그리기 어려운 히라가나(あいうえお) 대신 카타가나(アイウエオ) 를 나머지 128 비트 공간에 넣자 영어와 크기를 같게 하기 위해 "반각(半角)문자, Half-Width Katakana“ 사용 MBCS - Multi Byte Character Set 등장 최상위 비트가 0 이면 ASCII Code 로 해석 1 이면 2 바이트를 사용하는 일본어 문자셋을 찾는다 예 : 0xA1 0x72 0xA3 0x70 0x52 0xA2 0xA3 1 바이트가 0x00 ~ 0x7F (0~127)까지의 값이라면 ASCII 문자이다. 서유럽어는0x80 ~ 0xA0 (예약범위)까지 (128 ~ 160) 공간을 동아시아 MBCS 를 위해서 비워놓았다.
7. 한국 문자셋- 완성형과 조합형 완성형 : 완성형한글 2350자, 한자(4884개), 숫자,… “강“ : 0xB0C1 (0xB000 + 0xC0 + 0x1) 조합형 : 초성"ㄱ"과 중성"ㅏ"를 조립한 “가” 는 0x1100,0x1161 로 나타낼 수도 있다. 초성 ‘ㄱ’: 0x1100 HANGUL CHOSEONG KIYEOK 중성 ‘ㅏ’:0x1161 HANGUL JUNGSEON A 확장 1bit, 초성5bit, 중성 5bit, 종성 5bit
8. EUC Extened Unix Code(확장 유닉스 코드) 8비트 문자 인코딩 방식 ISO 2022 표준 기반 EUC-KR 은 KS X 1001, KS X 1003 사용 한글 완성형 인코딩 KS X 1003 는 역슬래쉬 대신 사용하는 것만 제외하면 ASCII 코드와 동일 KS X 1001 은 한글, 그림 문자, 한자 등을 포함 128보다 작은 바이트에 KS X 1003 배당 128보다 크거나 같은 바이트에 KS X 1001 배당 실제 사용공간이 상위바이트 161-254, 하위바이트 161-254 뿐이었기 때문에 ‘똠’이나 ‘뷁’ 같은 한글이 빠짐.
9. CP949 MS 가 KS X 1001 에 없는 한글 8822 자를 추가해 EUCKR 를 확장한 완성형 인코딩 ks_c_5601-1987 원래는 CodePage번호였으나 지금은 EUCKR 의 확장형인 한글 인코딩 방식을 지칭하는 이름이 되었다 ks_c_5601-92 도 있는 듯
10. iso2022-kr 과 KPS-9566 iso2022-kr EucKR을 7bit 만 사용하며 표현하는 방식으로 RFC1557 에 정의 KPS-9566 : 북한 유일의 고유 문자셋 한글 모양은 우리보다 300글자 정도 많고 한자는 200글자 정도 적다 한글 시작이 ‘가’ 가 아닌 ‘김일성김정일’ 6 글자가 먼저 배치되어 있다고... 자음 정렬 순서 ㄱㄴㄷㄹㅁㅂㅅㅈㅊㅋㅌㅍㅎㄲㄸㅃㅆㅉㅇ
11. Code Page 정의 : OS 에서 선택한 character code 들을 특정한 순서로 정리해 놓은 목록(IBM, MS) another name for character encoding(from wikipedia) 활성 코드 페이지 : 949 (완성형 확장) 한글 조합형 : Code Page 1361 영어 : ANSI-437 이스라엘 : ANSI-862 로케일 utf-8 : 65001 인코딩된 데이터를 어떻게 해석할 것인가 CHCP (change code page) Code Page Identifiers http://msdn.microsoft.com/en-us/library/dd317756
12. 문제점 다른 CodePage에서 파일을 열면 글자가 깨져 보임 여러 나라의 문자셋을 같이 보여줄 수 없음 소프트웨어를 바이너리 하나로 여러 나라에 판매할 수 없음 DOS 시절 일본 게임 때문에 인코딩 바꿨다면 나중에 인코딩을 돌려놔야 했다 모든 문자별로 유일한 값을 할당하고 싶다
13. Unicode 시작 모든 문자별로 유일한 Character Code 를 지정하자 1984년 ISO(국제표준기구)는 ISO 10646 국제 표준 체결 -> 모든 문자를 4 바이트로 1993년 5월그리스 아테네 회의 : 최종 확정 Unicode Working Group(1989년) Apple, Xerox, Sun, Microsoft, NeXT : 2 바이트 Unicode 컨소시엄의 제안 일부를 ISO 에서 수용 ISO 10646-1 Universal(Multiple-Octet Coded) Character Set: UCS 덕분에 Unicode 가 UCS 의 서브셋이 되었음 가장 최신 버전 표준 Unicode 5.2 ISO/IEC 10646:2003 plus Amendments 1,2,3,4,5,6
14. Unicode 구조 문자별로 번호(코드 포인트 Code Point) 지정 U+0041 U+ 는 Unicode 0041 : 코드 포인트 값으로 16 진수로 표기 U+0041 는 영어 알파벳 'A’ U+AC00 : 한글 '가‘ U+0000~U+00FF 영역은 ISO 8859-1 문자셋과 동일 한글은 U+AC00 ~ U+D7AF 영역에 정의 0x10FFFF^2 : 100만개 글자(10만개 사용)
15.
16. Unicode 체계 BMP (Basic multilingual Plane. 기본언어판) 최초 65536(2^16) 개의 문자 할당되는 영역. Unicode 3.0 : 49,194 문자 정의 UCS-2 과 동일 특히 한문에서 필요문자가 늘어나면서 보충언어판(Supplementary Plaines)을 정의 Unicode 3.1 에서는 BMP 에 2개 문자 추가, 보충언어판에44,944 개 문자 추가 음표,고대문자,한자(CJK Ideographic Extension B) CJK : 한국, 중국, 일본 Unicode 3.1: 49,194 + 44,944 = 94,140
17. UCS 체계 Cell : 한 개의 문자가 할당되는 공간 Plane : 256 * 256개의 cell 묶음 65536(0xFFFF) 개 -> UCS-2 BMP : Plain 00 Group : 256 개의 Plane 묶음(7F 개)
18. Unicode 표현 'A’ : U+0041 Group 00, Plane 00, Cell 41 '가’ : U+AC00 Group 00, Plane 00, Cell AC00 ♪ : U+1D160 Group 00, Plane 01, Cell D160 즉, Plain 번호 5비트, Cell 번호 16비트 21비트 공간 사용
19. Unicode 인코딩 UTF-32 UTF-16 UTF-8 UTF-7 email 용 UCS-2 UCS-4 UTF-32, UTF-16, UTF-8 모두 모든 Unicode 를 표현할 수 있으므로 서로 무손실 변환 가능 UCS-2 는 16 bit 이상 표현할 수 없기 때문에 unicode중에서 BMP 영역만 표현 가능
20. UTF-32 모든 문자를 코드 포인트 값 유지하면서 32 비트로 만든다. (고정길이) linux의 경우 wchar_t의 크기가 32bit 라서 mbstowcs()를 이용해서 변환 후 고정길이 인코딩처럼wcs함수를 사용하면 된다. UCS-4 의 부분집합(17 개의 언어판만 정의)
21. UTF-16 BMP 영역 안(U+0000-U+FFFF)의 문자는 그대로 표현, 밖의 문자는 변환 필요 (가변길이) Windows2000 과 이후 버전은 UTF-16 기반. 이전 NT 커널은UCS-2 기반 Java 2/Java 5는 UCS2/UTF-16에 의존 UCS-2 보다 확장된 개념
22. UTF-16 변환 규칙 Surrogate Pair (U+D800~U+DFFF) 에는 문자 할당되어 있지 않음
23. UTF-8 'A’ : U+0041같은 UTF-16 를 char 로 읽으면 00 (null) 문자열 때문에 기존 함수가 오작동 <html><head> <meta http-equiv=“Content-Type” content=“text/html;charset=utf-8”> Charset까지는 ascii로 읽고 charset읽은 후에 인코딩에 맞춰서 파싱 시작. 그러니 charset이전에 unicode인코딩 글자가 들어가면 안 됨 웹의 실질적 표준, 많은 *nix 시스템, xml, python 은 UTF-8 을 가장 기초적인 인코딩으로 사용 글자 길이를 알려면 전체 글을 파싱해야 함
24.
25. Unicode 한글에서 받침 알기 유니코드 2.0 : 한글은 초성 19개, 중성 21개, 종성 28개(없음도 포함)가 있다. 초성 19개를 0...18까지 번호를 붙이고 중성도 0...20, 종성도 역시 0...27까지 번호를 붙인다면, 원하는 코드는 0xAC00 + x*21*28 + y*28 + z (x=초성번호, y=중성번호, z=종성번호)로 만들 수 있다. 종성에서 0 번째에 해당하는 것은 '없음'이므로 유니코드값에서 0xAC00을 뺀 후에 28로 나누어 떨어지는지 확인하면 됩니다. http://jof4002.net/Unicode wchar_t* pString = L"가각나듯"; cout << (pString[0] - 0xAC00) % 28 << endl; // 0 cout << (pString[1] - 0xAC00) % 28 << endl; // 1 cout << (pString[2] - 0xAC00) % 28 << endl; // 0 cout << (pString[3] - 0xAC00) % 28 << endl; // 19
27. Unicode in VC++ std::locale::global(std::locale("" )); wcin.imbue(locale("korean")); 와 wcout.imbue(locale("korean")); wcout.fail() 로확인하고, wcout.clear(); _setmode(_fileno(stdout), _O_U16TEXT);
28. UTF-16 문자 개수 구하기 code snippet http://dodoubt.tistory.com/40참고
29. BOM(Byte Order Mark) 파일이 어떤 식으로 인코딩되어 있는지 알려주는 헤더 역할 UTF-32, big-endian : 00 00 FE FF UTF-32, little-endian : FF FE 00 00 UTF-16, big-endian : FE FF UTF-16, little-endian : FF FE UTF-8 : EF BB BF UTF-8 에서는 BOM 사용을 별로 권장하지 않음. UTF-8 이 기본 언어는 ASCII 와 호환된다는 장점이 있는데, BOM 처리를 하지 않는 editor 나 웹페이지에서는 BOM 을 i≫¿ 로 출력할 수 있다.
30. Font 문자 -> 유니코드 -> 유니코드 인코딩-> 화면 그리기 유니코드 폰트 Arial Unicode MS(ARIALUNI.TTF, 22,730KB) 함초롱체, 한컴 바탕 : http://maplestory.pe.kr/1785 고정길이 폰트(Monospace Font) 굴림체, 바탕체, 돋움체 가변길이 폰트 굴림, 바탕, 돋움 상관없지만 나눔고딕 코딩글꼴 http://dev.naver.com/projects/nanumfont/download Bitstream Vera Sans Mono + 맑은고딕 http://ggotbo.egloos.com/2334938
31. Console 에서의 폰트 [HKEY_CURRENT_USERonsoleSystemRoot%_system32_cmd.exe] "CodePage"=dword:000001b5 "FontSize"=dword:000c0000 "FontFamily"=dword:00000036 "FontWeight"=dword:00000190 "FaceName"=" 굴림체“ 명령 창에서 사용할 수 있도록 글꼴에 대해 필요한 조건 fixed-pitch font, not italic font,no negative A or C space if (TrueType) FF_MODERN else OEM_CHARSET http://support.microsoft.com/kb/Q247815 명령 프롬프트 디폴트 폰트 바꾸는 법 http://pcwinvista.tistory.com/340 http://dodoubt.tistory.com/34
34. 인코딩 SBCS(Single Byte Character Set) ASCII MBCS(Multi Byte Character Set) UTF-16, UTF-8 문자열 길이를 바로 알 수 없다. WBCS(Wide Byte Character Set) UTF-32, UCS-2, UCS-4 문자셋과인코딩이 동일 SBCD, MBCS, WBCS 는 인코딩 방법이지 인코딩이 아님
35. Reference Unicode 의 이해 – novo networks http://www.novonetworks.com/jamestic/Unicode_1.0.pdf 진숙의 유니코드 입문서 http://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.html MBCS 와 유니코드 http://www.animalpicturesarchive.com/jinsuk-kim/diary/read.php?2006/0203 위키백과– 유니코드, 유니코드 범위 목록 Unicode 5.2 Character Code Charts http://www.unicode.org/charts/ 조엘 온 소프트웨어 : 유니코드와 문자집합에 대한 고찰 http://www.joelonsoftware.com/articles/Unicode.html Character sets and codepages http://www.microsoft.com/typography/unicode/cscp.htm http://www.microsoft.com/typography/unicode/1250.gif 한글 코드페이지 http://www.unicode.org/charts/PDF/UAC00.pdf KS C 5601 완성형 코드 http://zbxe.bluegate.kr/42 http://whatisthat.co.kr/6
36. Reference http://jof4002.net/Unicode VC++ : 유니코드를 표준 출력에 내보내기 http://kaistizen.net/EE/index.php/weblog/comments/unicode_hangul_to_stdout/ IdeAthinKING - C file’s orientation http://ideathinking.com/blog/?p=108 http://ideathinking.com/blog/?p=109 rein : 인코딩과 문자집합: Unicode http://rein.kr/blog/archives/280 rein : Windows Character Encoding: UCS2? UTF-16? http://rein.kr/blog/archives/585 STL string 사용시 wstring일때, 출력이 되지 않습니다. http://kldp.org/node/93573 http://en.wikipedia.org/wiki/Code_page http://gpgstudy.com/gpgiki/윈도우 다국어 프로그래밍 MBCS 와 UNICODE FAQ 정리 http://mynotepad.tistory.com/67
37. Reference Unicode - (1) 개념 http://dodoubt.tistory.com/29 Standard output으로 unicode문자를 출력하기 (Win32 console application) http://dodoubt.tistory.com/35 Unicode - (2) UTF-16(wide character) in Windows http://dodoubt.tistory.com/36 Unicode - (3) UTF-8 in Windows http://dodoubt.tistory.com/38 Unicode - (4) 문자 개수 구하기, 변환(convert) code snippet http://dodoubt.tistory.com/40 window command prompt(cmd.exe)에서 사용하는 font 추가 및 변경하기 http://dodoubt.tistory.com/34 ASCII and Unicode quotation marks by Markus Kuhn http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html 유니 코드 (구원의 여신의 등장?) - 박우영 http://web.edunet4u.net/~han0416/%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4%20%EA%B0%95%EC%A2%8C/chapter2/uni_code.htm Code2001, a Plane 1 Unicode-based Font http://www.code2000.net/code2001.htm wprintf/wcout and unicode characters in VS2005 http://blog.kalmbachnet.de/?postid=98
38. Reference David Myriad Rosenbaum's Font Sanctuary (Ugaritic Font) http://davidmyriad.tripod.com/myriads.font.page.html http://www.alanwood.net/unicode/fonts-middle-eastern.html#ugaritic 외국어 지원을 위한 Unicode 활용 방법 http://www.ibm.com/developerworks/kr/library/l-linuni.html ASCII Table http://www.asciitable.com/ 심심할때 읽어보는 문자셋, 인코딩 이야기 http://blog.daum.net/_blog/tagArticleList.do?blogid=0Idq4&tagName=%EB%AC%B8%EC%9E%90%EC%85%8B#ajax_history_home 한글 인코딩 이야기 - (1) ASCII, 완성형, 조합형, EUCKR, CP949 http://heyjimin.tistory.com/14 한글 인코딩 이야기 - (2) 유니코드, UCS-2, UTF-8, UTF-16 http://heyjimin.tistory.com/15 http://namoda.springnote.com/pages/2017552 유니코드 볼 수 있는 에디터? KORAIS http://korais.sourceforge.net/screenshots.html