검색결과 리스트
coding에 해당되는 글 35건
- 2015.01.25 2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형
- 2015.01.25 1. 문자 인코딩
- 2015.01.25 1. 자신만의 에러 코드를 정의하는 법
글
2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형
char 형은 8 비트 ANSI 문자 표현을 위해 존재.
16비트 유니코드 표현을 위한 wchar_t 자료 형을 built-in 타입으로 사용할 수 있다. ( 과거에는 컴파일러 스위치가 필요했음 /Zc:wchar_t )
wchar_t c = L'A';
대문자 L 이 유니코드 문자열로 다루게끔 해준다.
데이터 섹션에 들어가게 될때 인코딩된다. 아스키문자인 경우 각 문자 사이에 0이 삽입된다.
윈도우는 C 언어의 자료형과, 윈도우 자료형을 구분하기 위해 WinNT.h 에 따로 정의한다.
typedef char CHAR;
typedef wchar_t WCHAR;
//8bit
typedef CHAR *PCHAR;
typedef CHAR *PSTR;
typedef CONST CHAR *PCSTR;
//16bit
typedef WCHAR *PWCHAR;
typedef WCHAR *PWSTR;
typedef CONST WCHAR *PCWSTR;
문자/문자열을 가리키는 포인터에 대해서도 별도로 정의하고 있음.
컴파일시 ANSI 문자나 유니코드를 사용하도록 변경가능하게 전처리기를 이용하여 작성할 수 있다.
#ifdef UNICODE
typedef WCHAR TCHAR, *PTCHAR, PTSTR;
typedef CONST WCHAR *PCTSTR;
#define __TEXT(quote) quote // r_winnt
#else
typedef CHAR TCHAR, *PTCHAR, PTSTR;...
#endif
'Windows C, C++ > 2. 문자와 문자열로 작업하기' 카테고리의 다른 글
3. 윈도우 내의 유니코드 함수와 ANSI 함수 (0) | 2015.01.25 |
---|---|
1. 문자 인코딩 (0) | 2015.01.25 |
설정
트랙백
댓글
글
1. 문자 인코딩
윈도우의 운영체제의 다국어 지원 기능을 통해 다국어 버전을 빨리 개발하여 출시 할 수 있다.
윈도우의 보안이 강화된 C 런타임 라이브러리 제공 함수들을 다루는데, 이를 활용하여 버퍼 오버런을 미연에 방지할 수 있다.
유니코드 기반의 문자를 사용하여 애플리케이션의 수행성능과 지역화를 쉽게 하고, COM 과 닷넷 프레임워크와의 상호운용도 손쉽게 해보자.
01. 문자인코딩
지역화의 문제 원인 : 다양한 문자 집합 고려에 그 뿌리를 둔다.
초창기 개발자들은 0으로 끝나는 1바이트 문자의 집합으로 문자열을 생각하고 개발해 왔는데, 256가지로는 표현할 수 없는 문자들이 등장.
> DBCS (double-bytes character set) 의 등장. ( 1바이트 / 2바이트 )
- 첫번째 문자가 어느 값 범위내에 있으면 하나의 문자를 결정하기 위해 다음 바이트를 확인해야함
이를 사용하는 것은 문자 길이 계산등과 같은 함수 구현만 생각해도 끔찍한 일..
> 유니코드의 등장
윈도우는 UTF-16 을 사용하여 인코딩한다. (UTF : Unicode Transformation Format)
각 문자를 2바이트로 구성.
전세계 대부분의 언어가 16비트로 표현이 가능하기 때문. 몇몇 언어는 32비트라야 표현이 가능한데, 공간 절약과 편의성의 절충안으로 16비트가 선택된 것..
- 윈도우 어플리케이션이 네이티브코드와 매니지드 코드 사이 문자열 전달이 필요하다면 UTF-16이 좋은 선택.
UTF-8
하나의 문자를 나타내기 위해 1 ~ 4 바이트로 인코딩한다. 0x0080 이하의 문자라면 1바이트로 인코딩. (영어에 잇어 최상의 방법)
0x0080 ~ 0x07FF 라면 2바이트. (유럽, 중동 언어 포함), 0x0800 이상이라면 3바이트. (동아시아 언어)
0x0800 문자를 많이 사용할 경우 비효율적.
UTF-32
모든 문자를 4바이트로 인코딩한다. 모든 언어에 대해 문자 변환 알고리즘을 간단히 구성하려 할때나 가변길이 인코딩 방식을 사용하지 않을 때 유용.
'Windows C, C++ > 2. 문자와 문자열로 작업하기' 카테고리의 다른 글
3. 윈도우 내의 유니코드 함수와 ANSI 함수 (0) | 2015.01.25 |
---|---|
2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형 (0) | 2015.01.25 |
설정
트랙백
댓글
글
1. 자신만의 에러 코드를 정의하는 법
반환 자료형
1. VOID - 실패하지 않음.
2. BOOL - 실패하면 0. 성공시에는 0 이 아닌값. TRUE 와 비교하는게 아니라 FALSE 와 비교하는게 좋은 방법.
3. HANDLE - 실패시 NULL. INVALID_HANDLE_VALUE ( -1 ) 을 리턴하는 경우도 있음.
4. PVOID - 실패시 NULL. 성공시 데이터의 메모리 주소를 가리킴
5. LONG/DWORD - 개수를 반환함. 실패시 0 또는 -1 (함수에 따라 다름) 을 반환.
실패한 원인 파악을 위해 함수 호출 실패시 그 함수를 호출한 스레드의 로컬스토리지에 에러코드를 저장해둠.
DWORD GetLastError() 로 얻어올 수 있다.
WinError.h 파일에 에러코드의 리스트가 저장되어 있다.
- 성공의 이유가 복수개인 경우에도 위와 같은 방법으로 구분할 수 있다.
Debug 상태에서 확인하려면
Watch 창에서 행선택후 $err,hr 입력
Visual Studio 에는 Error Loockup 유틸리티가 포함되어있음.
value 값을 넣으면 메시지가 출력됨
에러코드를 텍스트 메시지로 변환하려고 하는 경우
DWORD FormatMessage (
DWORD dwFlags,
LPCVOID pSource,
DWORD dwMessageId,
DWORD dwLanguageId,
PTSTR pszBuffer,
DWORD nSize,
va_list *Arguments);
- 언어 식별자를 인자로 받아 다양한 언어로 문자열 구성 가능.
어플리케이션단에서 이런 메커니즘을 이용할 수 있도록 다음 함수 이용가능
VOID SetLastError(DWORD dwErrCode);
어떠한 32 비트 값도 상관없음. WinErrorh 에 정의되어 있다면 가능한 이 에러코드를 사용하도록 한다.
자신만의 에러코드를 등록하여도 되는데, 32 비트를 여러 필드로 구분하여 의미를 부여한다.
비트 |
31-30 |
29 |
28 |
27-16 |
15-0 |
내용 |
심각도 |
마이크로소프트/고객 |
예약됨 |
식별 코드 |
예외 코드 |
의미 |
0 = 성공 1 = 정보 2 = 주의 3 = 에러 |
0 = 마이크로 소프트 1 = 고객 |
항상 0 | 256까지는 예약됨 |
정의한 코드 |