Unicodev 0.9박일http://AnDStudy.comhttp://parkpd.egloos.com
Character Set(문자셋)ASCII 는?26x2(알파벳 대소문자) + 10(숫자) + 특수문자 + 통제문자 등 모두 합쳐 128개 이하(2^7)로 표현 가능문자셋에 따라 움라우트 문제 등을 표현하기 위해 7bit 에 1bit 추가. (2^8)옛날 워드스타에서는 제어용으로 1 bit 를 사용.
완성형과 조합형"가"를 표현하는 방법KS C 5601 (완성형한글 2350자), 한자, 숫자 …euc-kr은 KS c 5601 이라고 한다.“강"0xB0C1 (0xB000 + 0xC0 + 0x1)조합형 : 초성"ㄱ"과 중성"ㅏ"를 조립한 "가"0x1100,0x1161 로 나타낼 수도 있다.초성 "ㄱ"은 0x1100 - HANGUL CHOSEONG KIYEOK중성 "ㅏ"는 0x1161 - HANGUL JUNGSEON A확장 1bit, 초성5bit, 중성 5bit, 종성 5bit
문제점다른 나라로 파일을 보내면 문자셋이 달라 깨져 보임여러 나라의 문자셋을 같이 보여줄 수 없음(도서관 같은 학술 자료)소프트웨어를 바이너리 하나로 여러 나라에 판매할 수 없음
Code PageCHCP (change code page)활성 코드 페이지 : 949 (완성형 확장)한글 조합형 : 초체 1361영어 : ANSI-437이스라엘 : ANSI-862로케일 utf-8 : 65001http://msdn.microsoft.com/en-us/library/dd317756[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]"CodePage"=dword:000001b5"FontSize"=dword:000c0000"FontFamily"=dword:00000036"FontWeight"=dword:00000190"FaceName"=" 굴림체"
Unicode 시작ISO(국제표준기구) 는 ISO 10646 국제 표준 체결모든 문자를 4 바이트로Unicode 컨소시엄Apple, Xerox, Sun, Microsoft, NeXT : 2 바이트Unicode 컨소시엄의 제안 일부를 ISO 가 수용ISO 10646-1Universal (Multiple-Octet Coded) Character Set : UCS덕분에 Unicode 가 UCS 의 서브셋이 되었음가장 최신 버전 표준Unicode 5.2ISO/IEC 10646:2003 plus Amendments 1,2,3,4,5 and 6
Unicode 구조문자별로 번호(코드 포인트 Code Point) 지정U+0041U+ 는 Unicode0041 : 코드 포인트 값으로 16 진수로 표기U+0041 는 영어 알파벳 'A’U+AC00 : 한글 '가‘U+0000~U+00FF 영역은 ISO 8859-1 문자셋과 동일ASCII 확장 문자셋(Western European. ISO)ISO/IEC 8859-1 	라틴-1 서유럽ISO/IEC 8859-2 	라틴-2 중앙유럽부터...ISO/IEC 8859-16 라틴-10 남동유럽 까지 있다.한글은 U+AC00 ~ U+D7AF 영역에 정의0x10FFFF^2 : 100만개 글자(실제로는 10만개 사용)
Unicode 체계BMP (Basic multilingual Plane. 기본언어판)최초 65536(2^16) 개의 문자 할당되는 영역.Unicode 3.0 : 49,194 문자 정의특히 한문에서 필요문자가 늘어나면서 보충언어판(Supplementary Plaines)을 정의Unicode 3.1 에서는 BMP 에 2개 문자 추가, 보충언어판에44,944 개 문자 추가음표,고대문자,한자(CJK Ideographic Extension B)CJK : 한국, 중국, 일본
Unicode 체계Cell : 한 개의 문자가 할당되는 공간Plane : 256 * 256 개의 cell 묶음 (FF 개)BMP : Plane 00Group : 256 개의 Plane 묶음(7F 개)
Unicode 표현'A’ : U+0041Group 00, Plane 00, Cell 41'가’ : U+AC00Group 00, Plane 00, Cell 41♪ : U+1D160Group 00, Plane 01, Cell D160즉, Plain 번호 5비트, Cell 번호 16비트21비트 공간 사용
Unicode 인코딩UTF-32UTF-16UTF-8UTF-7email 용UCS-2UCS-4모든 Unicode 표현할 수 있으므로 서로 무손실 변환 가능UTF-32모든 문자를 코드 포인트 값 유지하면서 32 비트로 만든다. (고정길이)linux의 경우 wchar_t의 크기가 32bit 라서 mbstowcs()를 이용해서 변환 후 고정길이 인코딩처럼wcs함수를 사용하면 된다.
UTF-16BMP 영역 안(U+0000-U+FFFF)의 문자는 그대로 표현, 밖의 문자는 변환 필요 (가변길이)Windows2000 과 그 이후 버전은 UTF-16 기반. 이전 NT 커널은UCS-2 기반.Java 2/Java 5는 UCS2/UTF-16에 의존.
UTF-16 변환 규칙Surrogate Pair (U+D800~U+DFFF) 에는 문자 할당되어 있지 않음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 을 가장 기초적인 인코딩으로 사용
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/Unicodewchar_t* pString = L"가각나듯";cout << (pString[0] - 0xAC00) % 28 << endl;  // 0cout << (pString[1] - 0xAC00) % 28 << endl;  // 1cout << (pString[2] - 0xAC00) % 28 << endl;  // 0cout << (pString[3] - 0xAC00) % 28 << endl;  // 19
Unicode 변환USES_CONVERSION;pI->SomeFunctionThatNeedsUnicode(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)
http://ikpil.com/1013#include <iostream>int main() {    std::locale::global( std::locale( "" ) );wchar_tstringdata[4] = { 0, };stringdata[0] = 0xac00; // 유니코드 "가" 와 같습니다 stringdata[1] = 0x3050; // 유니코드 "ぐ" 와 같습니다.stringdata[2] = 0x10a0; // 유니코드 "Ⴂ" 와 같습니다.    std::wcout << stringdata << "\n";    //std::wcout << L"안녕하세요\n";}std::locale::global( std::locale( "" ) ); 을 호출해 줘야 하는 이유는?locale::global 은 미리 생성되어 있는 wcout에는 먹히지 않는다.wcin.imbue( locale("korean") ); 와 wcout.imbue( locale("korean") ); 사용2. 유니코드 "?" 와 같습니다. 부터는 출력이 안 되는 이유는?현재 imbue되어 있는 locale로는 출력할 수 없는 character set을 만나면 state의 fail bit을 셋하게 되어 있었습니다. 이후 operation들은 현재 상태가 good()이 아니므로 모두 실패한 것이었습니다. wcout.fail() 로확인하고, wcout.clear(); 를 호출하면 된다.http://ideathinking.com/blog/?p=109
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 BFUTF-8 에서는 BOM 사용을 별로 권장하지 않음. UTF-8 이 기본 언어는 ASCII 와 호환된다는 장점이 있는데, BOM 처리를 하지 않는 editor 나 웹페이지에서는 BOM 을 i≫¿ 로 출력할 수 있다.
Font문자 -> 유니코드 -> 유니코드 인코딩-> 화면에 그리기유니코드 폰트Arial Unicode MS(ARIALUNI.TTF, 22,730KB)함초롱체, 한컴 바탕http://maplestory.pe.kr/1785
charmap
이데아문자유니코드유니코드 인코딩메모리폰트
인코딩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 는 인코딩 방법이지 인코딩은 아님
Reference대부분의 내용과 그림들의 출처http://www.novonetworks.com/jamestic/Unicode_1.0.pdfhttp://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.htmlUnicode 5.2 Character Code Chartshttp://www.unicode.org/charts/조엘 온 소프트웨어 : 유니코드와 문자집합에 대한 고찰한글 코드페이지 http://www.unicode.org/charts/PDF/UAC00.pdfKS C 5601 완성형 코드http://zbxe.bluegate.kr/42http://whatisthat.co.kr/6유니코드 범위 목록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%9Dhttp://ko.wikipedia.org/wiki/ISO/IEC_8859http://mynotepad.tistory.com/67http://ikpil.com/1013
Referencehttp://ggaman.com/tt/896http://jof4002.net/Unicodehttp://www.animalpicturesarchive.com/jinsuk-kim/diary/read.php?2006/0203http://kaistizen.net/EE/index.php/weblog/comments/unicode_hangul_to_stdout/http://ideathinking.com/blog/?p=109http://rein.kr/blog/archives/280http://rein.kr/blog/archives/585http://namoda.springnote.com/pages/2017552http://kldp.org/node/93573http://en.wikipedia.org/wiki/Code_pagehttp://www.gpgstudy.com/gpgiki/%EC%9C%88%EB%8F%84%EC%9A%B0%20%EB%8B%A4%EA%B5%AD%EC%96%B4%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
ReferenceUnicode - (1) 개념http://dodoubt.tistory.com/29Standard output으로 unicode문자를 출력하기 (Win32 console application)http://dodoubt.tistory.com/35Unicode - (2) UTF-16(wide character) in Windowshttp://dodoubt.tistory.com/36Unicode - (3) UTF-8 in Windowshttp://dodoubt.tistory.com/38Unicode - (4) 문자 개수 구하기, 변환(convert) code snippethttp://dodoubt.tistory.com/40
Unicode
Unicode

Unicode

  • 1.
  • 2.
    Character Set(문자셋)ASCII 는?26x2(알파벳대소문자) + 10(숫자) + 특수문자 + 통제문자 등 모두 합쳐 128개 이하(2^7)로 표현 가능문자셋에 따라 움라우트 문제 등을 표현하기 위해 7bit 에 1bit 추가. (2^8)옛날 워드스타에서는 제어용으로 1 bit 를 사용.
  • 3.
    완성형과 조합형"가"를 표현하는방법KS C 5601 (완성형한글 2350자), 한자, 숫자 …euc-kr은 KS c 5601 이라고 한다.“강"0xB0C1 (0xB000 + 0xC0 + 0x1)조합형 : 초성"ㄱ"과 중성"ㅏ"를 조립한 "가"0x1100,0x1161 로 나타낼 수도 있다.초성 "ㄱ"은 0x1100 - HANGUL CHOSEONG KIYEOK중성 "ㅏ"는 0x1161 - HANGUL JUNGSEON A확장 1bit, 초성5bit, 중성 5bit, 종성 5bit
  • 4.
    문제점다른 나라로 파일을보내면 문자셋이 달라 깨져 보임여러 나라의 문자셋을 같이 보여줄 수 없음(도서관 같은 학술 자료)소프트웨어를 바이너리 하나로 여러 나라에 판매할 수 없음
  • 5.
    Code PageCHCP (changecode page)활성 코드 페이지 : 949 (완성형 확장)한글 조합형 : 초체 1361영어 : ANSI-437이스라엘 : ANSI-862로케일 utf-8 : 65001http://msdn.microsoft.com/en-us/library/dd317756[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]"CodePage"=dword:000001b5"FontSize"=dword:000c0000"FontFamily"=dword:00000036"FontWeight"=dword:00000190"FaceName"=" 굴림체"
  • 6.
    Unicode 시작ISO(국제표준기구) 는ISO 10646 국제 표준 체결모든 문자를 4 바이트로Unicode 컨소시엄Apple, Xerox, Sun, Microsoft, NeXT : 2 바이트Unicode 컨소시엄의 제안 일부를 ISO 가 수용ISO 10646-1Universal (Multiple-Octet Coded) Character Set : UCS덕분에 Unicode 가 UCS 의 서브셋이 되었음가장 최신 버전 표준Unicode 5.2ISO/IEC 10646:2003 plus Amendments 1,2,3,4,5 and 6
  • 7.
    Unicode 구조문자별로 번호(코드포인트 Code Point) 지정U+0041U+ 는 Unicode0041 : 코드 포인트 값으로 16 진수로 표기U+0041 는 영어 알파벳 'A’U+AC00 : 한글 '가‘U+0000~U+00FF 영역은 ISO 8859-1 문자셋과 동일ASCII 확장 문자셋(Western European. ISO)ISO/IEC 8859-1 라틴-1 서유럽ISO/IEC 8859-2 라틴-2 중앙유럽부터...ISO/IEC 8859-16 라틴-10 남동유럽 까지 있다.한글은 U+AC00 ~ U+D7AF 영역에 정의0x10FFFF^2 : 100만개 글자(실제로는 10만개 사용)
  • 9.
    Unicode 체계BMP (Basicmultilingual Plane. 기본언어판)최초 65536(2^16) 개의 문자 할당되는 영역.Unicode 3.0 : 49,194 문자 정의특히 한문에서 필요문자가 늘어나면서 보충언어판(Supplementary Plaines)을 정의Unicode 3.1 에서는 BMP 에 2개 문자 추가, 보충언어판에44,944 개 문자 추가음표,고대문자,한자(CJK Ideographic Extension B)CJK : 한국, 중국, 일본
  • 10.
    Unicode 체계Cell :한 개의 문자가 할당되는 공간Plane : 256 * 256 개의 cell 묶음 (FF 개)BMP : Plane 00Group : 256 개의 Plane 묶음(7F 개)
  • 11.
    Unicode 표현'A’ :U+0041Group 00, Plane 00, Cell 41'가’ : U+AC00Group 00, Plane 00, Cell 41♪ : U+1D160Group 00, Plane 01, Cell D160즉, Plain 번호 5비트, Cell 번호 16비트21비트 공간 사용
  • 12.
    Unicode 인코딩UTF-32UTF-16UTF-8UTF-7email 용UCS-2UCS-4모든Unicode 표현할 수 있으므로 서로 무손실 변환 가능UTF-32모든 문자를 코드 포인트 값 유지하면서 32 비트로 만든다. (고정길이)linux의 경우 wchar_t의 크기가 32bit 라서 mbstowcs()를 이용해서 변환 후 고정길이 인코딩처럼wcs함수를 사용하면 된다.
  • 13.
    UTF-16BMP 영역 안(U+0000-U+FFFF)의문자는 그대로 표현, 밖의 문자는 변환 필요 (가변길이)Windows2000 과 그 이후 버전은 UTF-16 기반. 이전 NT 커널은UCS-2 기반.Java 2/Java 5는 UCS2/UTF-16에 의존.
  • 14.
    UTF-16 변환 규칙SurrogatePair (U+D800~U+DFFF) 에는 문자 할당되어 있지 않음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 을 가장 기초적인 인코딩으로 사용
  • 16.
    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/Unicodewchar_t* pString = L"가각나듯";cout << (pString[0] - 0xAC00) % 28 << endl; // 0cout << (pString[1] - 0xAC00) % 28 << endl; // 1cout << (pString[2] - 0xAC00) % 28 << endl; // 0cout << (pString[3] - 0xAC00) % 28 << endl; // 19
  • 17.
    Unicode 변환USES_CONVERSION;pI->SomeFunctionThatNeedsUnicode(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)
  • 18.
    http://ikpil.com/1013#include <iostream>int main(){ std::locale::global( std::locale( "" ) );wchar_tstringdata[4] = { 0, };stringdata[0] = 0xac00; // 유니코드 "가" 와 같습니다 stringdata[1] = 0x3050; // 유니코드 "ぐ" 와 같습니다.stringdata[2] = 0x10a0; // 유니코드 "Ⴂ" 와 같습니다. std::wcout << stringdata << "\n"; //std::wcout << L"안녕하세요\n";}std::locale::global( std::locale( "" ) ); 을 호출해 줘야 하는 이유는?locale::global 은 미리 생성되어 있는 wcout에는 먹히지 않는다.wcin.imbue( locale("korean") ); 와 wcout.imbue( locale("korean") ); 사용2. 유니코드 "?" 와 같습니다. 부터는 출력이 안 되는 이유는?현재 imbue되어 있는 locale로는 출력할 수 없는 character set을 만나면 state의 fail bit을 셋하게 되어 있었습니다. 이후 operation들은 현재 상태가 good()이 아니므로 모두 실패한 것이었습니다. wcout.fail() 로확인하고, wcout.clear(); 를 호출하면 된다.http://ideathinking.com/blog/?p=109
  • 19.
    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 BFUTF-8 에서는 BOM 사용을 별로 권장하지 않음. UTF-8 이 기본 언어는 ASCII 와 호환된다는 장점이 있는데, BOM 처리를 하지 않는 editor 나 웹페이지에서는 BOM 을 i≫¿ 로 출력할 수 있다.
  • 20.
    Font문자 -> 유니코드-> 유니코드 인코딩-> 화면에 그리기유니코드 폰트Arial Unicode MS(ARIALUNI.TTF, 22,730KB)함초롱체, 한컴 바탕http://maplestory.pe.kr/1785
  • 21.
  • 22.
  • 23.
    인코딩SBCS(Single Byte CharacterSet)ASCIIMBCS(Multi Byte Character Set)UTF-16, UTF-8문자열 길이를 바로 알 수 없다.WBCS(Wide Byte Character Set)UTF-32, UCS-2, UCS-4문자셋과인코딩이 동일SBCD, MBCS, WBCS 는 인코딩 방법이지 인코딩은 아님
  • 24.
    Reference대부분의 내용과 그림들의출처http://www.novonetworks.com/jamestic/Unicode_1.0.pdfhttp://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.htmlUnicode 5.2 Character Code Chartshttp://www.unicode.org/charts/조엘 온 소프트웨어 : 유니코드와 문자집합에 대한 고찰한글 코드페이지 http://www.unicode.org/charts/PDF/UAC00.pdfKS C 5601 완성형 코드http://zbxe.bluegate.kr/42http://whatisthat.co.kr/6유니코드 범위 목록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%9Dhttp://ko.wikipedia.org/wiki/ISO/IEC_8859http://mynotepad.tistory.com/67http://ikpil.com/1013
  • 25.
  • 26.
    ReferenceUnicode - (1)개념http://dodoubt.tistory.com/29Standard output으로 unicode문자를 출력하기 (Win32 console application)http://dodoubt.tistory.com/35Unicode - (2) UTF-16(wide character) in Windowshttp://dodoubt.tistory.com/36Unicode - (3) UTF-8 in Windowshttp://dodoubt.tistory.com/38Unicode - (4) 문자 개수 구하기, 변환(convert) code snippethttp://dodoubt.tistory.com/40