2005년쯤에 어느분이 쓰신 글(어느글인지 링크를 잊어버림)을 나름 요약해 보았다.
Ansistring 과 Uncode 문자열의 개념과 처리방법에 대해 쉽게 이해할 수 있다.
#ads_1
AnsiString
SBCS (Single Byte Character Set) : 오로지 1 byte로 구성된 문자셋. 알파벳과 일부 특수문자만 표현 가능.
DBCS (Double Byte Character Set) : 영문은 1byte 한글은 2 byte로 표현하는 확장형 Ansi 문자코드
MBCS (Multi Byte Character Set) : 하나의 글자를 표현할때 여러바이트가 조합될 수 있는 문자세트. 대부분은 2 byte를 사용한다.
Unicode
윈도우에서는 UCS-2(16 bit) 를 사용하고 Unix 는 UCS-4(32 bit) 를 사용한다.
윈도우는 Multibyte 와 UCS-2를 동시에 제공한다.
VC++에 UNICODE(_UNICODE) 매크로가 정의되어 있으면 유니코드로 컴파일한다.
문자열상수 표현법
Ansi : "한글"
Unicode : L"한글"
통합형 : Window API => TEXT("한글"), MFC => _T("한글")
문자자료형
Ansi : char, CHAR
Unicode : wchar_t, WCHAR
통합형 : TCHAR
요약표
설명 |
ANSI |
UNICODE |
통합형 |
문자열상수 표현 | "한글abc" | L"한글abc" | TEXT("한글abc") : api, _T("한글abc") |
char | char | wchar_t | TCHAR |
char* |
PSTR |
PWSTR LPWSTR |
PTSTR LPTSTR ※ "L"이 붙은거나 아닌거나 같다 |
const char* | PCSTR LPCSTR |
PCWSTR LPCWSTR |
PCTSTR LPCTSTR |
문자열 함수 | 접두사: str~ 예: strpos |
접두사: wcs~ 예: wcspos |
접두사: _tcs~ 예: _tcspos |
Window API 함수 | 접미사:
~A 예: MessageBoxA() lstrlenA() lstrcpyA() lstrcatA() 실제로는 Ansi문자열을 받아서 ~W로 전달한다. |
접미사:
~W 예: MessageBoxW() lstrlenW() lstrcpyW() lstrcatW() |
접미사:
없음 |
printf 함수 sprintf 함수 |
printf() sprintf() |
wsprintf() swprintf() |
_tprintf() _stprintf() ※ windows API : wsprintf() |
#ads_2
언어별 스트링 비교
int CompareString( LCID lcid, DWORD fdwStyle, PCWSTR pString1, int cch1, PCTSTR pString2, int cch2);
lcid : 지역 ID (MSDN 참조)
문자열이 ANSI 인지 UNICODE 인지 구별하는 함수
DWORD IsTextUnicode(CONST PVOID pvBuffer, int cb, PINT pResult);
: 버퍼의 내용을 통계적으로 비교하기 때문에 정확하지 않을 수 있다. MSDN 참조
UNICODE <=> ANSI 상호변환
윈도우즈 :
ANSI -> UNICODE : int MultiByteToWideChar(...)
UNICODE -> ANSI : int WideCharToMultiByte(...)
C++ :
ANSI -> UNICODE : mbstowcs(...)
UNICODE -> ANSI : wcstombs(...)
구조체
UNICODE 매크로 상수에 의해 정의가 달라짐
메시지
시스템이 문자코드에 맞게 변환해주기 때문에 신경쓰지 않아도 된다
리소스
문자열테이블, 메뉴캡션, 대화상자 컨트롤 캡션, 대화상자 타이틀 등의 리소스는 unicode로만 저장된다.
STL
ANSI :
typedef basic_string<char> string; (std::string)
UNICODE :
typedef basic_string<wchar_t> wstring (std::wstring)
VC++ 에서 국가별 언어코드 바꾸기
한글 윈도우에서 한글 작성 => 잘 나옴
중문 윈도우에서 한글 작성 => 중국어로 나옴
=> VC++이 Windows 에 세팅된 언어값을 디폴트로 사용하기 때문
해결책:
#pragma setlocale("kor")
문자열 크기 알아내기
sizeof(szBuf) : X
sizeof(szBuf * sizeof(TCHAR)) : O
#ads_3