원래 C와 C++은 문자열을 메모리에 저장할 때 문자열의 끝에 NULL 문자열(\0)을 추가하여 문자열의 끝을 알리는 방법을 사용하고 있다
그리고 문자열이 메모리 상에서 시작되는 주소를 변수에 저장하여, 차후에 문자열을 읽어 올 때 그 주소에 가서 NULL문자열이 발견될 때까지 읽어오는 방법을 사용한다. 즉, C언어에서는 아무리 긴 문자열이라도 문자열의 첫 문자의 주소를 저장하면 되므로 char * 형으로 메모리상의 문자열을 가리킬 수 있다.
Windows 개발환경 에서는 문자열을 표현할 때 char*형을 그대로 쓰기보다는 LPCSTR등의 표현으로 대치해 개발의 편의를 도모하고 있다
LP ( Long Pointer )
- Windows3.1에서 Pointer는 16bits, Long Pointer는 24bits를 의미함, 16 비트를 확장하여 24비트로 확장된 메모리에 주소를 저장하는 것을 말함
- 메모리의 주소를 24비트 보다 큰 곳에 저장하는 현재에는 LP에 24비트 의미가 있는 것이 아니라 일반 포인터 변수의 의미를 가진다고 할 수 있다
C ( Constraint )
- 상수를 의미함
W ( Wide Character )
- Multi-Byte 문자가 아니라 유니코드(Unicode) 문자열을 의미함
- Multi-Byte : 각국의 문자 중에는 2바이트 이상으로 표현해야만 하는 문자들이 존재하기 때문에 해당 국가에서는 국제 표준표기법(Unicode)이 존재하기 전 부터 자국의 문자를 표현하기 위해 국제표준이 아닌 해당국가 내의 표준 표현법을 정하여 사용하고 있었는데, 이를 Multi-Byte 문자라고 말한다. 문자 1자를 표현할 때 2~4바이트가 사용된다
- Unicode : 세게 각국의 문자를 2바이트로 고정하여 표현하는 방법
- w_char : 유니코드 문자형을 의미함
T
- 프로젝트 설정에 따라서 소스코드의 문자열이 Multi-Byte 혹은 Unicode 로 자동으로 적용되는 매크로 기능
- TCHAR : 프로젝트 설정에 따라서 char혹은 w_char형으로 자동으로 설정된다
STR
- 문자열 (NULL 종료 문자열)
string ( STL 문자열 )
- c_str() 함수를 이용하여 C 스타일 문자열로 변환이 가능함
CString ( MFC 문자열 )
- LPCTSTR 형으로 형변환이 가능함
그러므로 다음과 같은 자료형의 해석이 가능하다
LPSTR = long pointer string = char *
LPCSTR = long pointer constant stsring = const char *
LPWSTR = long pointer wide string = w_char*
LPCWSTR = long pointer constant wide string = const w_char*
LPCTSTR = long pointer constant t_string = const tchar *
MFC의 CString 형은 앞의 16비트에 자료형태가 기록되고 뒤 이어서 문자열이 저장되므로 형변환할 때 주의할 필요가 있다. CString문자열은 LPCTSTR형으로 먼저 캐스팅해야만 안전하게 문자열 데이터를 가져오도록 연산자 오버로드되어 있다. 그러나 Visual Studio 2005 이후로는 아래의 형변환 방법도 제대로 기능을 하지 못하기 때문에 주의해야 한다. 아래의 형변환 방법을 대체하기 위한 변환 클래스(CT2CA)를 사용하는 것이 바람직하다.
CString myStr = "Hello";
LPSTR lpsz = (LPSTR)(LPCTSTR) myStr; // VS 2005 부터는 이런 형변환 방식은 제대로 작동하지 않을 수도 있기 때문에 주의해야 함
Visual Studio 2005 부터는 문자의 기본포맷이 유니코드로 정착되면서 위의 형변환( CString to std::string )이 가능하지 않을 수도 있다.
그래서 변환전용 클래스( CT2CA )가 제공되기에 이르렀고 다음과 사용할 수 있다.
CT2CA 클래스 사용법 (Convert from LPCTSTR to ANSI)
CString myStr("Hello");
CT2CA ct2caMyStr(myStr);
LPSTR pszStr = ct2caMyStr.m_psz;
CA2CT 사용법 (Convert from ANSI to LPCTSTR)
std::string strA = "Hello"
CA2CT ca2ctStr (strA.c_str() );
AfxMessageBox(ca2ctStr.m_psz);