winapi:unicode
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판 | |||
winapi:unicode [2021/04/30 11:16] – kieuns | winapi:unicode [2024/04/23 22:43] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ====== 유니코드 한글 문자표 ====== | ||
+ | * 한글자모 : U1100 ~ U11FF \\ 4352 ~ 4607 | ||
+ | * 한글완성 : UAC00 ~ UD7A3 \\ 44032 ~ 55203 | ||
+ | |||
+ | ====== API로 지원되는 문자 영역 정보 확인 ====== | ||
+ | |||
+ | GetTextCharsetInfo(), | ||
+ | |||
+ | < | ||
+ | // 이런 값을 받아 왔다면, (한글 맑은 굴림의 문자셋 정보) | ||
+ | & | ||
+ | fsUsb 0x0039edbc unsigned long [4] | ||
+ | [0x0] 0x900002af unsigned long | ||
+ | [0x1] 0x01d77cfb unsigned long | ||
+ | [0x2] 0x00000012 unsigned long | ||
+ | [0x3] 0x00000000 unsigned long | ||
+ | fsCsb 0x0039edcc unsigned long [2] | ||
+ | [0x0] 0x00080001 unsigned long | ||
+ | [0x1] 0x00000000 unsigned long | ||
+ | </ | ||
+ | |||
+ | fsUsb 각 비트를 체크하면 된다. | ||
+ | |||
+ | * 126 ~ 128bit 유니코드 서브셋 비트정보. | ||
+ | * 왼쪽2비트는 무시. | ||
+ | * 가장 왼쪽 1비트는 항상 1. 가장 기본이 되는 알파벳이라서. | ||
+ | * 두번째 왼쪽비트는 예약, 그리고 항상 0. 그런데 꼭 0은 아닌듯. | ||
+ | * 유니코드의 | ||
+ | |||
+ | 각 비트를 체크해서 해당 문자열이 지원되는지 알아보는 예제 코드 | ||
+ | |||
+ | <code cpp> | ||
+ | void CfontCharViewDlg:: | ||
+ | { | ||
+ | for (int i=0;i < this-> | ||
+ | { | ||
+ | this-> | ||
+ | } | ||
+ | |||
+ | // | ||
+ | // | ||
+ | CClientDC _dc( AfxGetMainWnd() ); | ||
+ | |||
+ | int _charsetinfo; | ||
+ | FONTSIGNATURE _fontsig; | ||
+ | _dc.SelectObject( mFont.font() ); | ||
+ | _charsetinfo = GetTextCharsetInfo( _dc.m_hDC, & | ||
+ | |||
+ | // codepage : http:// | ||
+ | WCHAR* _charsetSubset[] = | ||
+ | { | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L"IPA Extensions", | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L"Box Drawing", | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L"CJK Miscellaneous", | ||
+ | L" | ||
+ | L"CJK Compatibility", | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L"CJK Unified Ideographs", | ||
+ | L" | ||
+ | L"CJK Compatibility Ideographs", | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L"CJK Compatibility Forms", | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | L" | ||
+ | }; | ||
+ | // | ||
+ | |||
+ | int _index = 0; | ||
+ | // 일단 70개만 확인할거라. | ||
+ | for( _index = 0; _index <= 69; ) | ||
+ | { | ||
+ | // DWORD 4개에 대해서 체크할 것이므로 4번 돌자. | ||
+ | for( int j = 0; j < 4; ++j ) | ||
+ | { | ||
+ | // 4바이트의 비트수 (32비트)만큼 반복 | ||
+ | DWORD _sample = _fontsig.fsUsb[j]; | ||
+ | for( int i = 0; i < 32; ++i ) | ||
+ | { | ||
+ | // 가장 왼쪽의 비트가 1인지 확인해서 | ||
+ | DWORD _result = (_sample & 0x80000000); | ||
+ | if( _result & 0x80000000 ) | ||
+ | { | ||
+ | // 1이면, 여기에 해당하는 문자셋을 지원하므로 어딘가에 저장. | ||
+ | this-> | ||
+ | } | ||
+ | _sample = _sample << 1; | ||
+ | |||
+ | ++_index; | ||
+ | if( _index > 69 ) break; | ||
+ | } | ||
+ | if( _index > 69 ) break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ |