Program 언어/MFC

MBCS->WCS ( ASCII 코드 -> 유니코드 )

건실한청년 2022. 7. 13. 14:31

MFC에서 바꾸는 이런 방법도 있다고 한다.

- MB TO UNICODE

char* pszText = "MB TO UNICODE" ;

CString strUnicode( pszText ) ;

 

- UNICODE TO MB

wchar_t* pszText = _T("UNICODE TO MB") ;

CStringA strMB( pszText ) ;

 

- CStringA TO CString

CStringA strMB ;

CString strUNICODE( strMB ) ;

 

[출처] CString, CStringA|작성자 구운감자

 

 

visual Studio 6.0 에서는 되는 것들이 Visual studio 2013 에 오니 안되는 것들이 너무 많다.
그중 하나가 멀티코드와 유니코드 이다. 무수히 많은 코드를 변환하는중이다.

CString 과 CStringA의 차이는 네이버에 정리된 것을 옮겨봤다.
====================================================================================================================

MFC와 윈도우API함수는 거의 모두 2가지 버전이 존재합니다. 각기 MBCS(multi-byte character set) 문자열-즉 아스키(ASCII)코드 문자열을 쓰는 함수와 WCS(wide character string)-즉 유니코드 문자열을 쓰는 함수입니다. 이 두 종류의 함수는 동일한 이름이 앞에 오고 제일 뒤에 ASCII를 나타내는 A와 Wide Character를 나타내는 W를 붙여서 구분하고 있습니다. 예를들어, GetWindowText같은 함수의 경우, 실제로는

     
  GetWindowTextA
GetWindowTextW
 
     

두 종류의 함수가 존재합니다. 앞의 것은 ASCII 코드용이고, 뒤의 것은 유니코드 용이죠.

이 두종류의 함수는 프로그래머가 직접 호출하는 것이 아니라 GetWindowText라는 매크로를 통해 호출하도록 설계되어 있습니다. 코드에서 GetWindowText 매크로는 프로젝트 세팅에 따라 MBCS프로젝트라면 GetWindowTextA 로 정의되고, 유니코드 프로젝트라면 GetWindowTextW로 정의되어 컴파일시에 치환됩니다.

 

CString 클래스의 경우도 마찬가지로, 문자열을 다루는 클래스이므로 당연히 구분되어야 합니다.

다만, VC++8.0에서는 프로젝트 기본 세팅이 유니코드 프로젝트이므로 CString이라고만 하면 내부적으로 CStringW로 치환하여 유니코드용 클래스와 함수를 사용하는 코드가 만들어집니다. 따라서, 유니코드 프로젝트에서 CString을 사용할 때는 같이 사용하는 객체와 함수 역시 유니코드용으로 만들어진 것들을 써야 합니다.

C++표준 라이브러리와 함께 사용할 때에는, cout은 MBCS기반의 출력 객체이고, 유니코드(즉, wide character) 기반의 출력 객체는 wcout으로 구분되어 있습니다.

cout을 굳이 써야만 한다면 CString이라는 이름은 내부적으로는 매크로에 의해 CStringW로 대체되므로, 매크로에 의해 치환되지 않는 이름인 CStringA로 명시하여 변환하여 써야 하겠습니다.

유니코드 프로젝트에서 CString 객체의 내용을 표준 라이브러리로 출력하고자 할 때는 wcout을 써야 합니다. 물론, 이때 문자열 상수 역시 TEXT() 매크로로 둘러싸서 정의해야 제대로 된 결과를 얻을 수 있습니다. 예를 들자면,

     
  CString str(TEXT("한국어"));
wcout << (LPCTSTR)str << endl;
 
     

이렇게 하시면 됩니다.

 

====================================================================================================================