수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694060
  • Today | 411
  • Yesterday | 588

2 Articles, Search for 'Ansi'

  1. 2007/03/05 Unicode/MBCS(DBCS)/ANSI/TCHAR
  2. 2007/03/01 Ansi 문자열과 Unicode 문자열 바꾸기
Programming/ATL/COM2007/03/05 16:56

Unicode/MBCS(DBCS)/ANSI/TCHAR

원본 : http://www.debuglab.com/knowledge/unicodembcs.html

1.요약

각각의 차이점을 짧게 소개하고, 사용시 주의점을 살펴봅니다.


2.본문

문자열 세트를 나타내는 각각의 용어에는 다음과 같은 뜻이 있습니다.

[Unicode] 2바이트가 하나의 문자를 나타내며, 세계 각국의 언어를 동일한 코드로 표현할 수 있습니다. Windows NT/2000 운영체제는 내부적으로 Unicode를 사용하고 있습니다. 그렇기 때문에 API 호출시에 Unicode 를 사용한다면 보다 효율적입니다. C++에서는 wchar_t 타입을 사용합니 다.

[MBCS/DBCS] 하나의 문자를 나타내기 위해서 한 바이트 이상이 사용됩니다. DBCS는 한 바이트 혹은 두 바이트가 하나의 문자를 나타내는 MBCS의 특수한 경우입니다.
C++ 에서는 unsigned char 타입을 사용합니다.( 보통은 char를 사용하는 것 같습니다)

[ANSI] 한 바이트로 하나의 문자를 나타내는 코드입니다. C++ 에서는 char 타입을 사용합니다.

[TCHAR] char 혹은 wchar_t가 될 수 있는 매크로 입니다.

-------------------------------------------------------------------

Unicode를 사용해서 프로그램을 작성하는 것은 다음과 같은 장단점이 있습니다.

장점 - Windows NT/2000에서, 보다 효율적이다.
단점 - Windows 9X 에서 실행되지 않는다.

MBCS/ANSI를 사용해서 프로그램을 작성하는 것은 다음과 같은 장단점 이 있습니다.

장점 - Windows 9X/NT/2000 에서 다 돌아간다.
단점 - Windows NT/2000 에서, 보다 비효율적이다.

------------------------------------------------------------------

즉, 상황에 맞는 선택이 필요한 것인데, 그렇다고 상황이 변할때 마다 코드를 재작성 할 수는 없는 일이기에 TCHAR 라는 매크로를 사용하기에 이르렀습니다.

TCHAR는 평소에는 char로 활약하다가 유사시에는 wchar_t가 되는 매크로입니다.

관련된 내용은 훌륭한 서적/참고 자료가 많이 있으므로 생략하고 간단한 참고 자료를 제시하겠습니다.

-----------------------------------------------------------------

프로젝트에서 UNICODE 혹은 _UNICODE라는 심볼이 미리 정의되는 경우 TCHAR는 wchar_t로 돌변합니다. 물론 이는 아주 단적인 예이고, 올바르게 표현하자면 다음과 같이 될 것입니다.

UNICODE 가 미리 정의된 경우 winnt.h에서 다음의 매크로는 화살표에 이끌려 다음과 같이 정의됩니다.

TCHAR --> wchar_t 

TEXT,__TEXT --> L 

_UNICODE가 미리 정의된 경우 tchar.h에서 다음의 매크로는 화살표에 이끌려 다음과 같이 정의됩니다.

TCHAR --> wchar_t 

_T,__T,_Text --> L 

쉽게 얘기해서 UNICODE는 SDK에서 쓰는 것이고 _UNICODE는 CRT에서 사용하는 것입니다.

우리가 알아야 할 것은 두 가지 모두 정의해야 한다는 점입니다.

------------------------------------------------------------------

_MBCS가 미리 정의된 경우 다음의 매크로는 화살표에 이끌려 다음과 같이 정의됩니다.

TCHAR --> char 

_T,__TEXT --> 사라짐 

위에서 언급한 무엇도 정의되지 않은 경우 다음의 매크로는 화살표에 이끌려 다음과 같이 정의됩니다.

TCHAR --> char 

_T, __TEXT --> 사라짐 

------------------------------------------------------------------

물론 위의 내용은 타입이나 리터럴의 경우만 언급한 것이고, 함수들 예를 들어, _tcscat 이 _strcat 또는 wcscat 또는 _mbscat 등으로 바뀌는 일도 발생합니다.


3.예제



4.참고

ATL Internals



- 2001.08.13 Smile Seo -
"ATL/COM" 카테고리의 다른 글
  • ActiveX를 무조건 다운로드 하게 하기 (0)2007/03/15
  • String Conversion Macro (0)2007/03/08
  • Unicode/MBCS(DBCS)/ANSI/TCHAR (0)2007/03/05
  • [ATL] 새로운 인터페이스 추가하기 (0)2007/03/05
  • COM 형식 라이브러리 사용하기 (0)2007/01/05
2007/03/05 16:56 2007/03/05 16:56
Posted by webdizen
Tags Ansi, MBCS, TCHAR, Unicode
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2680

Leave your greetings.

[로그인][오픈아이디란?]

Programming/Win32 API2007/03/01 11:56

Ansi 문자열과 Unicode 문자열 바꾸기

원본 : http://www.debuglab.com/knowledge/ansiunicode.html

1.요약

Anis 문자열과 Unicode 문자열을 서로 바꾸는 함수를 만들어 봅니다.


2.본문

COM 프로그래밍을 하다보면, BSTR 과의 호환성을 이루기 위해서 Ansi 문자열을 Unicode 문자열로 그리고 그 반대의 문자열 변화가 필요한 경우가 있습니다. 이런 경우 유용하게 사용할 수 있는 두가지 함수, AnsiToUnicode & UnicodeToAnsi 함수를 만들어 보도록 하겠습니다.


3.예제

/* 

* AnsiToUnicode converts the ANSI string pszA to a Unicode string 

* and returns the Unicode string through ppszW. Space for the 

* the converted string is allocated by AnsiToUnicode. 

*/ 



HRESULT __fastcall AnsiToUnicode(LPCSTR pszA, LPOLESTR* ppszW) 

{ 

    

    ULONG cCharacters; 

    DWORD dwError; 

    

    // 입력한 값이 NULL 이면 return 합니다. 

    if (NULL == pszA) 

    { 

        *ppszW = NULL; 

        return NOERROR; 

    } 

    

    // Unicode 로 할당될 문자열의 길이를 구합니다. 

    cCharacters =  strlen(pszA)+1; 

    

    // Unicode 문자열을 위해서 CoTaskMemAlloc() 함수를 사용하여 

    // 문자열을 할당합니다. 

    *ppszW = (LPOLESTR) CoTaskMemAlloc(cCharacters*2); 

    if (NULL == *ppszW) 

        return E_OUTOFMEMORY; 

    

    // Unicode 로 바꿉니다. 

    if (0 == MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters, 

        *ppszW, cCharacters)) 

    { 

        dwError = GetLastError(); 

        CoTaskMemFree(*ppszW); 

        *ppszW = NULL; 

        return HRESULT_FROM_WIN32(dwError); 

    } 

    

    return NOERROR; 

} 



/* 

* UnicodeToAnsi converts the Unicode string pszW to an ANSI string 

* and returns the ANSI string through ppszA. Space for the 

* the converted string is allocated by UnicodeToAnsi. 

*/ 



HRESULT __fastcall UnicodeToAnsi(LPCOLESTR pszW, LPSTR* ppszA) 

{ 

    

    ULONG cbAnsi, cCharacters; 

    DWORD dwError; 

    

    // 입력 값이 NULL 이면 return 

    if (pszW == NULL) 

    { 

        *ppszA = NULL; 

        return NOERROR; 

    } 

    

    cCharacters = wcslen(pszW)+1; 

    

    cbAnsi = cCharacters*2; 

    

    *ppszA = (LPSTR) CoTaskMemAlloc(cbAnsi); 

    if (NULL == *ppszA) 

        return E_OUTOFMEMORY; 

    

    // ANSI 문자열로 바꿉니다. 

    if (0 == WideCharToMultiByte(CP_ACP, 0, pszW, cCharacters, *ppszA, 

        cbAnsi, NULL, NULL)) 

    { 

        dwError = GetLastError(); 

        CoTaskMemFree(*ppszA); 

        *ppszA = NULL; 

        return HRESULT_FROM_WIN32(dwError); 

    } 

    return NOERROR; 

    

}


4.참고

Knowledge Base : Q138813



- 2001.08.13 Smile Seo -
"Win32 API" 카테고리의 다른 글
  • Alt+F4 키로 종료되는거 막는 방법 (0)2007/03/01
  • 문자열을 _T() 형으로 바꿔주는 매크로 (0)2007/03/01
  • Ansi 문자열과 Unicode 문자열 바꾸기 (0)2007/03/01
  • Console 프로젝트와 Windows 프로젝트 바꾸기 (0)2007/03/01
  • 절전 기능 및 화면 보호기 제어하기 (0)2007/03/01
2007/03/01 11:56 2007/03/01 11:56
Posted by webdizen
Tags Ansi, Unicode
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2645

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Exchange Server 2007
  • 삼척캠퍼스
  • 온라인 복구
  • 영어
  • Dialog Box
  • 전병욱
  • 윈도우 모바일 7.0
  • 화면 캡처
  • 보드카
  • 조니워커 블랙
  • Keyword
  • gcc
  • W3C
  • 우선순위
  • Network Policy Server
  • Development
  • Geotracking
  • 연쇄살인범
  • 시스템이용률
  • Polling

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.