Unicode 이해하기

28,133 views

Published on

Unicode,UTF-8, UTF-16, UTF-32,UCS-2, UCS-4,유니코드

Published in: Technology
3 Comments
38 Likes
Statistics
Notes
No Downloads
Views
Total views
28,133
On SlideShare
0
From Embeds
0
Number of Embeds
1,516
Actions
Shares
0
Downloads
0
Comments
3
Likes
38
Embeds 0
No embeds

No notes for slide

Unicode 이해하기

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

×