문자열을 사용한 작업
이 항목에서는 Windows에서 UI 요소, 파일 이름 등에 대해 유니코드 문자열을 지원하는 방법을 설명합니다(유니코드는 모든 문자 집합 및 언어를 지원하므로 기본 설정 문자 인코딩임).
Windows는 각 문자가 하나 또는 두 개의 16비트 값으로 인코딩되는 UTF-16 인코딩을 사용하여 유니코드 문자를 나타냅니다. 8비트 ANSI 문자와 구분하기 위해 UTF-16 문자를 와이드 문자라고 합니다. Visual C++ 컴파일러는 와이드 문자에 대한 기본 제공 데이터 형식인 wchar_t를 지원합니다. 헤더 파일 WinNT.h는 또한 다음 typedef도 정의합니다.
typedef wchar_t WCHAR;
와이드 문자 리터럴 또는 와이드 문자열 리터럴을 선언하려면 리터럴 앞에 L을 놓습니다.
wchar_t a = L'a';
wchar_t *str = L"hello";
다음 표에는 다른 문자열 관련 typedef가 나와 있습니다.
형식 정의 | 정의 |
---|---|
CHAR | char |
PSTR 또는 LPSTR | char* |
PCSTR 또는 LPCSTR | const char* |
PWSTR 또는 LPWSTR | wchar_t* |
PCWSTR 또는 LPCWSTR | const wchar_t* |
유니코드 및 ANSI 함수
Microsoft가 Windows에 유니코드 지원을 도입했을 때 ANSI 문자열과 유니코드 문자열에 대한 두 개의 병렬 API 집합을 제공하여 쉽게 전환할 수 있도록 했습니다. 예를 들어 창 제목 표시줄의 텍스트를 설정하는 두 가지 함수가 있습니다.
- SetWindowTextA는 ANSI 문자열을 사용합니다.
- SetWindowTextW는 유니코드 문자열을 사용합니다.
내부적으로 ANSI 버전은 문자열을 유니코드로 변환합니다. 또한 Windows 헤더는 전처리기 기호 UNICODE
가 정의된 경우 유니코드 버전으로, 그렇지 않은 경우 ANSI 버전으로 확인되는 매크로를 정의합니다.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
함수는 실제 함수 이름이 아니라 실제로 매크로 이름임에도 불구하고 SetWindowText 이름으로 문서화됩니다.
새 애플리케이션은 항상 유니코드 버전을 호출해야 합니다. 많은 세계 언어에는 유니코드가 필요합니다. ANSI 문자열을 사용하는 경우 애플리케이션을 지역화할 수 없습니다. ANSI 버전은 또한 운영 체제가 런타임에 ANSI 문자열을 유니코드로 변환해야 하므로 효율성이 떨어집니다. 기본 설정에 따라 SetWindowTextW와 같은 유니코드 함수를 명시적으로 호출하거나 매크로를 사용할 수 있습니다. 가장 최근의 Windows API에는 일반적으로 유니코드 버전만 있습니다.
TCHAR
경우에 따라 대상 플랫폼에 따라 ANSI 또는 유니코드 문자열에 대해 동일한 코드를 컴파일하는 것이 유용할 수 있습니다. 이를 위해 Windows SDK는 플랫폼에 따라 문자열을 유니코드 또는 ANSI에 매핑하는 매크로를 제공합니다.
매크로 | Unicode | ANSI |
---|---|---|
TCHAR | wchar_t |
char |
TEXT("x") 또는 _T("x") |
L"x" |
"x" |
예를 들어, 다음 코드는
SetWindowText(TEXT("My Application"));
다음 중 하나로 확인됩니다.
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
모든 애플리케이션에서 유니코드를 사용해야 하므로 TEXT와 TCHAR 매크로는 현재 유용성이 떨어집니다.
Microsoft C 런타임 라이브러리의 헤더는 유사한 매크로 집합을 정의합니다. 예를 들어 _tcslen은 _UNICODE
가 정의되지 않은 경우 strlen으로 확인됩니다. 그러지 않으면 strlen의 와이드 문자 버전인 wcslen으로 확인됩니다.
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
주의: 일부 헤더는 전처리기 기호 UNICODE
를 사용하고 다른 헤더는 밑줄 접두사와 함께 _UNICODE
를 사용합니다. 항상 두 기호를 모두 정의하세요. Visual C++는 새 프로젝트를 만들 때 기본적으로 둘 다 설정합니다.