플밍

UNICODE 문자열 정리 본문

프로그래밍/C/C++

UNICODE 문자열 정리

너구리안주 2013. 11. 4. 01:03

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
LPSTR

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()




접미사: 없음

예:
MessageBox()
lstrlen()
lstrcpy()
lstrcat()




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

Comments