Unicode

2,743 views

Published on

Unicode (유니코드) 의 이해 v 0.8

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,743
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Unicode

  1. 1. Unicode<br />박일<br />http://AnDStudy.com<br />http://parkpd.egloos.com<br />
  2. 2. Character Set(문자셋)<br />ASCII 는?<br />26x2(알파벳 대소문자) + 10(숫자) + 특수문자 + 통제문자 등 모두 합쳐 128개 이하(2^7)로 표현 가능<br />문자셋에 따라 움라우트 문제 등을 표현하기 위해 7bit 에 1bit 추가. (2^8)<br />옛날 워드스타에서는 제어용으로 1 bit 를 사용.<br />
  3. 3. 완성형과 조합형<br />"가"를 표현하는 방법<br />KS C 5601 (완성형한글 2350자), 한자, 숫자 …<br />“강"0xB0C1 (0xB000 + 0xC0 + 0x1)<br />조합형 : 초성"ㄱ"과 중성"ㅏ"를 조립한 "가"0x1100,0x1161 로 나타낼 수도 있다.<br />초성 "ㄱ"은 0x1100 - HANGUL CHOSEONG KIYEOK<br />중성 "ㅏ"는 0x1161 - HANGUL JUNGSEON A<br />확장 1bit, 초성5bit, 중성 5bit, 종성 5bit<br />
  4. 4. 문제점<br />다른 나라로 파일을 보내면 문자셋이 달라 깨져 보임<br />여러 나라의 문자셋을 같이 보여줄 수 없음(도서관 같은 학술 자료)<br />소프트웨어를 바이너리 하나로 여러 나라에 판매할 수 없음<br />
  5. 5. Unicode 시작<br />ISO(국제표준기구) 는 ISO 10646 국제 표준 체결<br />모든 문자를 4 바이트로<br />Unicode 컨소시엄<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 and 6<br />
  6. 6. 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 />ASCII 확장 문자셋(Western European. ISO)<br />ISO/IEC 8859-1 라틴-1 서유럽<br />ISO/IEC 8859-2 라틴-2 중앙유럽부터...<br />ISO/IEC 8859-16 라틴-10 남동유럽 까지 있다.<br />한글은 U+AC00 ~ U+D7AF 영역에 정의<br />0x10FFFF^2 : 100만개 글자(실제로는 10만개 사용)<br />
  7. 7.
  8. 8. Unicode 체계<br />BMP (Basic multilingual Plane. 기본언어판)<br />최초 65536(2^16) 개의 문자 할당되는 영역.<br />Unicode 3.0 : 49,194 문자 정의<br />특히 한문에서 필요문자가 늘어나면서 보충언어판(Supplementary Plaines)을 정의<br />Unicode 3.1 에서는 BMP 에 2개 문자 추가, 보충언어판에44,944 개 문자 추가<br />음표,고대문자,한자(CJK Ideographic Extension B)<br />
  9. 9. Unicode 체계<br />Cell : 한 개의 문자가 할당되는 공간<br />Plane : 256 * 256 개의 cell 묶음 (FF 개)<br />BMP : Plane 00<br />Group : 256 개의 Plane 묶음(7F 개)<br />
  10. 10. Unicode 표현<br />'A’ : U+0041<br />Group 00, Plane 00, Cell 41<br />'가’ : U+AC00<br />Group 00, Plane 00, Cell 41<br />♪ : U+1D160<br />Group 00, Plane 01, Cell D160<br />즉, Plain 번호 5비트, Cell 번호 16비트<br />21비트 공간 사용<br />
  11. 11. Unicode 인코딩<br />UTF-32<br />UTF-16<br />UTF-8<br />UTF-7<br />UCS-2<br />UCS-4<br /><ul><li>모든 Unicode 표현할 수 있으므로 서로 무손실 변환 가능</li></li></ul><li>UTF-32<br />모든 문자를 코드 포인트 값 유지하면서 32 비트로 만든다. (고정길이)<br />linux의 경우 wchar_t의 크기가 32bit 라서 mbstowcs()를 이용해서 변환 후 고정길이 인코딩처럼wcs함수를 사용하면 된다.<br />
  12. 12. UTF-16<br />BMP 영역 안(U+0000-U+FFFF)의 문자는 그대로 표현, 밖의 문자는 변환 필요 (가변길이)<br />Windows2000 과 그 이후 버전은 UTF-16 기반. 이전 NT 커널은UCS-2 기반.<br />Java 2/Java 5는 UCS2/UTF-16에 의존.<br />
  13. 13. UTF-16 변환 규칙<br /><ul><li>Surrogate Pair (U+D800~U+DFFF) 에는 문자 할당되어 있지 않음</li></li></ul><li>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 />
  14. 14.
  15. 15. 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 />
  16. 16. Unicode 변환<br />USES_CONVERSION;<br />pI->SomeFunctionThatNeedsUnicode(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 />
  17. 17. http://ikpil.com/1013<br />#include <iostream><br />intmain() {<br /> std::locale::global( std::locale( "" ) );<br />wchar_tstringdata[4] = { 0, };<br />stringdata[0] = 0xac00; // 유니코드 "가" 와 같습니다 <br />stringdata[1] = 0x3050; // 유니코드 "ぐ" 와 같습니다.<br />stringdata[2] = 0x10a0; // 유니코드 "Ⴂ" 와 같습니다.<br /> std::wcout << stringdata << " ";<br /> //std::wcout << L"안녕하세요 ";<br />}<br />std::locale::global( std::locale( "" ) ); 을 호출해 줘야 하는 이유는?<br />locale::global 은 미리 생성되어 있는 wcout에는 먹히지 않는다.<br />wcin.imbue( locale("korean") ); 와 wcout.imbue( locale("korean") ); 사용<br />2. 유니코드 "?" 와 같습니다. 부터는 출력이 안 되는 이유는?<br />현재 imbue되어 있는 locale로는 출력할 수 없는 character set을 만나면 state의 fail bit을 셋하게 되어 있었습니다. 이후 operation들은 현재 상태가 good()이 아니므로 모두 실패한 것이었습니다. wcout.fail() 로확인하고, wcout.clear(); 를 호출하면 된다.<br />http://ideathinking.com/blog/?p=109<br />
  18. 18. 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 />
  19. 19. CHCP, charmap<br />CHCP (change code page)<br />활성 코드 페이지 : 949<br />
  20. 20. 이데아<br />문자<br />유니코드<br />유니코드 인코딩<br />메모리<br />폰트<br />
  21. 21. 인코딩<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 />
  22. 22. Reference<br />대부분의 내용과 그림들의 출처<br />http://www.novonetworks.com/jamestic/Unicode_1.0.pdf<br />http://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.html<br />Unicode 5.2 Character Code Chartshttp://www.unicode.org/charts/<br />조엘 온 소프트웨어 : 유니코드와 문자집합에 대한 고찰<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 />유니코드 범위 목록<br />http://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%EB%B2%94%EC%9C%84_%EB%AA%A9%EB%A1%9D<br />http://ko.wikipedia.org/wiki/ISO/IEC_8859<br />http://mynotepad.tistory.com/67<br />http://ikpil.com/1013<br />
  23. 23. Reference<br />http://ggaman.com/tt/896<br />http://jof4002.net/Unicode<br />http://www.animalpicturesarchive.com/jinsuk-kim/diary/read.php?2006/0203<br />http://kaistizen.net/EE/index.php/weblog/comments/unicode_hangul_to_stdout/<br />http://ideathinking.com/blog/?p=109<br />http://rein.kr/blog/archives/280<br />http://rein.kr/blog/archives/585<br />http://namoda.springnote.com/pages/2017552<br />http://kldp.org/node/93573<br />
  24. 24. 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 />

×