알라딘MGG와이드바


[아꿈사] 유니코드 이해하기 개발 이야기

Unicode 에 대해서 모르는 게 너무 많더군요. 저는 그저 wchar 에 wstring 만 쓰면 유니코드를 제대로 쓰고 있는 거라고 생각했었더라지요. 참고자료 찾아보면서 잘못 알고 있던 사실이 너무 많아서 깜짝 놀랬습니다. 여기 정리한 것도 오류가 있을지 모르니 너그럽게 봐 주세요. 참고로 이미지 자료는 많은 부분을 Unicode의 이해 에서 가져왔습니다. PDF 자료도 같이 읽어보시면 큰 도움이 될 겁니다 :) 펼쳐보기
  1. Unicode v 1.0 박일 http://AnDStudy.com http://parkpd.egloos.com
  2. 문자? 문자셋? 인코딩? 폰트?문자는 대소문자 구별을 한다. 영어 문자는 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
  3. ASCII26x2(알파벳 대소문자) + 10(숫자) + 특수문자 + 통제문자 -> 128개 이하(2^7)옛날 워드스타에서는 나머지 1 bit 를 제어용으로 사용
  4. 서유럽으로 간 ASCII움라우트 등을 표현하기 위해 7bit 에 1bit 추가 (2^8)ASCII 확장 문자셋을 ISO 가 관리하게 됨 ISO/IEC 8859-1 라틴-1 서유럽 ISO/IEC 8859-2 라틴-2 중앙유럽 부터... ISO/IEC 8859-16 라틴-10 남동유럽 까지
  5. 일본으로 간 문자셋1바이트로 일본어를 표현하기 글자가 둥글어 그리기 어려운 히라가나(あいうえお) 대신 카타가나(アイウエオ) 를 나머지 128 비트 공간에 넣자 영어와 크기를 같게 하기 위해 "반각(半角)문자, Half-Width Katakana“ 사용MBCS - Multi Byte Character Set 등장 최상위 비트가 0 이면 ASCII Code 로 해석 1 이면 2 바이트를 사용하는 일본어 문자셋을 찾는다예 : 0xA1 0x72 0xA3 0x70 0x52 0xA2 0xA31 바이트가 0x00 ~ 0x7F (0~127)까지의 값이라면 ASCII 문자이다.서유럽어는 0x80 ~ 0xA0 (예약범위)까지 (128 ~ 160) 공간을 동아시아 MBCS 를 위해서 비워놓았다.
  6. 한국 문자셋 - 완성형과 조합형완성형 : 완성형한글 2350자, 한자(4884개), 숫자,… “강“ : 0xB0C1 (0xB000 + 0xC0 + 0x1)조합형 : 초성"ㄱ"과 중성"ㅏ"를 조립한 “갚 는 0x1100,0x1161 로 나타낼 수도 있다. 초성 ‘ㄿ : 0x1100 HANGUL CHOSEONG KIYEOK 중성 ‘ㅏ’ : 0x1161 HANGUL JUNGSEON A 확장 1bit, 초성 5bit, 중성 5bit, 종성 5bit
  7. EUCExtened 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 뿐이었기 때문에 ‘똠’이나 ‘뷁’ 같은 한글이 빠짐.
  8. CP949MS 가 KS X 1001 에 없는 한글 8822 자를 추가해 EUCKR 를 확장한 완성형 인코딩ks_c_5601-1987원래는 CodePage 번호였으나 지금은 EUCKR 의 확장형인 한글 인코딩 방식을 지칭하는 이름이 되었다ks_c_5601-92 도 있는 듯
  9. iso2022-kr 과 KPS-9566iso2022-kr EucKR 을 7bit 만 사용하며 표현하는 방식으로 RFC1557 에 정의KPS-9566 : 북한 유일의 고유 문자셋 한글 모양은 우리보다 300글자 정도 많고 한자는 200글자 정도 적다 한글 시작이 ‘갗 가 아닌 ‘김일성김정일’ 6 글자가 먼저 배치되어 있다고... 자음 정렬 순서 ㄱㄴㄷㄹㅁㅂㅅㅈㅊㅋㅌㅍㅎㄲㄸㅃㅆㅉㅇ
  10. 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
  11. 문제점다른 CodePage 에서 파일을 열면 글자가 깨져 보임여러 나라의 문자셋을 같이 보여줄 수 없음소프트웨어를 바이너리 하나로 여러 나라에 판매할 수 없음DOS 시절 일본 게임 때문에 인코딩 바꿨다면 나중에 인코딩을 돌려놔야 했다모든 문자별로 유일한 값을 할당하고 싶다
  12. 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
  13. 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만개 사용)
  14. 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
  15. UCS 체계Cell : 한 개의 문자가 할당되는 공간Plane : 256 * 256개의 cell 묶음 65536(0xFFFF) 개 -> UCS-2BMP : Plain 00Group : 256 개의 Plane 묶음(7F 개)
  16. Unicode 표현'A’ : U+0041 Group 00, Plane 00, Cell 41'갗 : U+AC00 Group 00, Plane 00, Cell 41♪ : U+1D160 Group 00, Plane 01, Cell D160즉, Plain 번호 5비트, Cell 번호 16비트 21비트 공간 사용
  17. Unicode 인코딩UTF-32UTF-16UTF-8UTF-7 email 용UCS-2UCS-4 모든 Unicode 표현할 수 있으므로 서로 무손실 변환 가능
  18. UTF-32모든 문자를 코드 포인트 값 유지하면서 32 비트로 만든다. (고정길이)linux의 경우 wchar_t 의 크기가 32bit 라서 mbstowcs()를 이용해서 변환 후 고정길이 인코딩처럼 wcs함수를 사용하면 된다.UCS-4 의 부분집합(17 개의 언어판만 정의)
  19. UTF-16BMP 영역 안(U+0000-U+FFFF)의 문자는 그대로 표현, 밖의 문자는 변환 필요 (가변길이)Windows 2000 과 이후 버전은 UTF-16 기반. 이전 NT 커널은 UCS-2 기반Java 2/Java 5는 UCS2/UTF-16에 의존UCS-2 보다 확장된 개념
  20. UTF-16 변환 규칙Surrogate Pair (U+D800~U+DFFF) 에는 문자 할당되어 있지 않음
  21. 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 을 가장 기초적인 인코딩으로 사용글자 길이를 알려면 전체 글을 파싱해야 함
  22. 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
  23. Unicode 변환USES_CONVERSION;pI->SomeFunctionNeedsUnicode(T2OLE(lpszA));매크로 인자 결과A2CW (LPCSTR) (LPCWSTR)A2W (LPCSTR) (LPWSTR)W2CA (LPCWSTR) (LPCSTR)W2A (LPCWSTR) (LPSTR)T2COLE (LPCTSTR) (LPCOLESTR)T2OLE (LPCTSTR) (LPOLESTR)OLE2CT (LPCOLESTR) (LPCTSTR)OLE2T (LPCOLESTR) (LPCSTR)
  24. 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);
  25. UTF-16 문자 개수 구하기code snippet http://dodoubt.tistory.com/40 참고
  26. BOM(Byte Order Mark)파일이 어떤 식으로 인코딩되어 있는지 알려주는 헤더 역할UTF-32, big-endian : 00 00 FE FFUTF-32, little-endian : FF FE 00 00UTF-16, big-endian : FE FFUTF-16, little-endian : FF FEUTF-8 : EF BB BF UTF-8 에서는 BOM 사용을 별로 권장하지 않음. UTF-8 이 기본 언어는 ASCII 와 호환된다는 장점 이 있는데, BOM 처리를 하지 않는 editor 나 웹페 이지에서는 BOM 을 i≫¿ 로 출력할 수 있다.
  27. 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
  28. Console 에서의 폰트[HKEY_CURRENT_USERConsole %SystemRoot%_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
  29. charmap
  30. 이데아문자-> 유니코드-> 유니코드 인코딩-> 폰트
  31. 인코딩SBCS(Single Byte Character Set) ASCIIMBCS(Multi Byte Character Set) UTF-16, UTF-8 문자열 길이를 바로 알 수 없다.WBCS(Wide Byte Character Set) UTF-32, UCS-2, UCS-4 문자셋과 인코딩이 동일SBCD, MBCS, WBCS 는 인코딩 방법이지 인코딩이 아님
  32. ReferenceUnicode 의 이해 – 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.htmlCharacter 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.pdfKS C 5601 완성형 코드 http://zbxe.bluegate.kr/42 http://whatisthat.co.kr/6
  33. Referencehttp://jof4002.net/UnicodeVC++ : 유니코드를 표준 출력에 내보내기 http://kaistizen.net/EE/index.php/weblog/comments/unicode_hangul_to_stdout/IdeA thinKING - C file’s orientation http://ideathinking.com/blog/?p=108 http://ideathinking.com/blog/?p=109rein : 인코딩과 문자집합: Unicode http://rein.kr/blog/archives/280rein : Windows Character Encoding: UCS2? UTF-16? http://rein.kr/blog/archives/585STL string 사용시 wstring 일때, 출력이 되지 않습니다. http://kldp.org/node/93573http://en.wikipedia.org/wiki/Code_pagehttp://gpgstudy.com/gpgiki/윈도우 다국어 프로그래밍MBCS 와 UNICODE FAQ 정리 http://mynotepad.tistory.com/67
  34. ReferenceUnicode - (1) 개념 http://dodoubt.tistory.com/29Standard output으로 unicode 문자를 출력하기 (Win32 console application) http://dodoubt.tistory.com/35Unicode - (2) UTF-16(wide character) in Windows http://dodoubt.tistory.com/36Unicode - (3) UTF-8 in Windows http://dodoubt.tistory.com/38Unicode - (4) 문자 개수 구하기, 변환(convert) code snippet http://dodoubt.tistory.com/40window command prompt(cmd.exe)에서 사용하는 font 추가 및 변경하기 http://dodoubt.tistory.com/34ASCII 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.htmCode2001, a Plane 1 Unicode-based Font http://www.code2000.net/code2001.htmwprintf/wcout and unicode characters in VS2005 http://blog.kalmbachnet.de/?postid=98
  35. ReferenceDavid 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.htmlASCII Table http://www.asciitable.com/심심할때 읽어보는 문자셋, 인코딩 이야기 http://blog.daum.net/_blog/tagArticleList.do?blogid=0Idq4&tagName=%EB%A C%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/15http://namoda.springnote.com/pages/2017552유니코드 볼 수 있는 에디터? KORAIS http://korais.sourceforge.net/screenshots.html
닫기

핑백

덧글

  • CharSyam 2010/07/18 13:35 # 삭제 답글

    Unicode 가 전부 알려면 복잡한데,
    현실적으로 사용하는 것은 UTF-8, UCS-2,, 각 개별 국가 코드(특히 CJK 쪽에서) 정도입니다.
    리눅스에서는 UCS-4도 쓰는 것 같던데, 뭐, 대세는 UTF-8인듯 합니다.(윈도우는 그냥 UCS-2가 대세 ㅋㅋ)

    그럼 고운 하루되세용.
  • 飛烏 2010/07/19 16:58 # 삭제

    프리젠테이션 자료를 보면 windows 2000 이상에서는 UTF-16 을 쓴다고 하는데, 요즘도 UCS-2 가 대세인가요?
  • 박PD 2010/07/19 18:39 #

    OS 내부적으로는 UTF-16 을 쓰는 듯 하지만
    프로그래밍쪽에서 생각해보면 2bytes 인 wchar 를 UCS-2 방식으로 쓰고 있는 듯 합니다.
  • 지나가다 2010/07/19 17:10 # 삭제 답글

    19페이지에 오류가 아닌지요? ucs-2는 utf-16과 호환되지 않는 것 같은데요?
  • 지나가다 2010/07/19 17:11 # 삭제

    ucs-2는 모든 unicode 표현은 불가하니 여타의 것과 무손실변환은 불가능한 것 아닌지?
    (ucs2와 utf-16과 다른 것이니까요)
  • 박PD 2010/07/19 18:36 #

    네, 발표할 때는 UTF8, UTF16, UTF32 끼리만 호환된다고 얘기하고
    UCS-2, UCS-4 는 UTF 와 서로 부분집합의 개념으로 보면 된다고 얘기를 했는데
    발표자료만 놓고보면 전부 호환되는 거 처럼 보이겠네요. 지적 감사합니다.
  • LazyArtist 2010/07/19 23:39 # 삭제 답글

    좋은 자료네요~ 잘 봤습니다~
  • 박PD 2010/07/20 00:26 #

    감사합니다 :)
  • zelon 2010/07/20 00:17 # 삭제 답글

    유니코드는 이상하게 볼 때마다 새롭다는 느낌이 드는데, 잘 정리해주셨네요~ 잘보고 갑니다.

    ctrl+cv 오타가 하나 있는거 같은데, 18페이지에 '가' 의 cell 이 41이 아니고 AC00 아닌가요? ^^;; (아님 제가 잘못이해한건지도 ㄷㄷ)
  • 박PD 2010/07/20 00:26 #

    네. 오타 맞을겁니다. 발표하면서 오타네요 라고 한 부분이 있는데 그대로 올라간 거 같네요. 지적 감사합니다.
  • 박PD 2010/07/21 00:24 # 답글

    오타 수정한 버전 올렸습니다.
  • Aiba 2010/08/19 17:12 # 답글

    자료를 봐도 잘 이해가 안되네요^^;
    중요한건 알지만 소홀히하게되는 내용 되짚어주셔서 감사해요~
    더 찾아봐야겠네요!
  • 박PD 2010/08/20 13:02 #

    네, 저도 자료 준비하면서 모르는게 참 많았다는 걸 알게 되었습니다.
댓글 입력 영역


Yes24위대한게임의탄생3

위대한 게임의 탄생 3
예스24 | 애드온2