본문 바로가기

デベロップメント/Win32 API

Windows와 문자 코드

원문 http://wisdom.sakura.ne.jp/system/winapi/win32/win4.html


문자의 데이터 형태

빨리 윈도우를 표시시키고, 멀티 미디어같은 조작을 하고싶은지도 모르겠습니다만

아쉽지만 이건 조금 더 전의 이야기가 되겠습니다.

왜냐하면은, 그 끔직한 소스 파일을 보이게 된다면

기억하기도 전에 하기 싫어질 수 밖에 없으니까요. (좌절(挫折()()))경험이 있는 분은 잘 모르겠지만요)


거기서 일단 Windows 프로그래밍을 이해하는데 중요한

또 한편으로는 장래성(将来性) 있는 소스 기술(記述)을 위해 Windows의 문자 코드와 데이터 형태의 설명을 합니다.


장래성을 생각하여, 이제부터 문자 코드는 Unicode를 쓸 것이에요.

Windows NT는 이미 Unicode를 지원하고 있습니다.

하지만, Windows 9x 시리즈는 Unicode에 미대응(未対応)이라 어려운 부분입니다.


그렇다고 해서, 프로그래머가 플랫폼마다 코드를 나눠 쓸 필요는 없습니다.

Windows SDK는 이 차이을 정교하게 줄이고 있습니다.
다만,  이것을 이용하기 위해서는 그것 나름대로의 데이터 형(型)의 지식이 필요합니다.

여기만 넘기면, 장래(将来) Unicode판(版)에 코드를 고쳐 쓰는 일이 적어집니다.


Windows에서는, 다음의 기본 데이터 형을 다음과 같이 정의하고 있습니다.
이하(以下)의 데이터 형의 정의는, WINNT.H 헤더파일에 정의되어 있습니다.

typedef char CHAR;
typedef short SHOTR;
typedef long LONG;

이건 간단하네요, 대문자로 된 것 뿐입니다.
또, 확장 문자는 다음과 같이 정의되어 있습니다.

typedef wchar_t WCHAR;

Microsoft는, wc를 변수명의 선두에 붙이도록 권장하고 있습니다.
이건, 헝가리 기법(記法)라는 기술법으로, 변수명을 보기만 해도 형태를 알 수 있습니다.
예를들어, wcStr이라는 변수명은, WCHAR 형으로 되어있는 것을 알 수 있습니다.
Windows 프로그램에는, 이 헝가리 기법에 대한 기술이 권장되고 있습니다.

WinMain() 함수의 세번째 인수의 형 LPSTR은 다음의 정의로 되어있습니다.

typedef CHAR* LPSTR;

어떻습니까, 이걸로 정체(正体)를 알수 있다고 생각합니다.
언뜻보기에는 복잡한 데이터형도, 더듬어 보면 형태를 알 수 있는 것 입니다.

LRSTR의 L은 Long을 나타내는 것으로, 16비트 시대의 산물이라는 점에서
PSTR(P는 포인터)이라는 것으로 존재합니다. (형태는 LPSTR과 똑같음)

#include<windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	return 0;
}
세번째 인수 LPSTR이 PSTR로 되어있는 것을 알 수 있다고 생각합니다.
형은 똑같기 때문에, 이 기술에 문제는 없습니다.
상기(上記)한 이유에서 LPSTR이 아닌 PSTR을 좋아하는 프로그래머도 있습니다.

그러면, 기본적인 것을 알았다면 다시 Unicode의 이야기로 돌아갑시다.
사실 SDK에서는 Unicode가 정의 되었다면 확장 문자로 정의되고
Unicode 미대응이라면 char 형의 1바이트로 컴파일하는 방법이 있습니다.

그건 TCHAR형, *PTCHAR형을 사용하는 방법입니다.

이것들 두개의 데이터형은 다음과 같이 정의되어 있습니다.


#ifdef UNICODE
typedef WCHAR TCHAR , *PTCHAR ;
#else
typedef char TCHAR , *PTCHAR ;
#endif

도중에 다른 데이터 형도 많이 정의되고 있습니다만 생략하겠습니다.

UNICODE 식별자의 정의에 대해서, 비트 수를 변화시키고 싶은 문자열에 이를 사용합니다.



TEXT 매크로

여기서 간단히 TEXT 매크로에 대해서도 언급해하겠습니다.

TEXT 매크로는 UNICODE가 정의되어 있는가 어떤가로 문자열에 L을 부가(付加)합니다.


#define __T(x) L ## x

이것이 최종적으로 매크로가 됩니다만, TEXT(x)는 여기에 x를 넘겨줍니다.
UNICODE가 정의되지 않으면, 아무것도 하지 않습니다.

이 강좌의 샘플 프로그램도, 되는대로 쌍방에 대응되도록 하기 위해
TEXT() 매크로나 TCHAR 형을 사용해서, 범용적(汎用的)인 코드 프로그램을 유의합시다.
실제 사용예는 다음 장에서 소개하겠습니다.




이전 페이지
목차
다음 페이지