SlideShare a Scribd company logo
1 of 17
구본탁
1. 문자 인코딩
문자 인코딩 관련 용어
문자셋(Character-Set) 그래픽 문자의 집합으로 하나의 그래픽 문자는 그 문자를 나타내는 숫자에
대응된다. 숫자와 그래픽 문자가 대응되는 하나의 테이블.
(ex. ASCII코드표)
인코딩(Encoding) 문자를 다른 문자셋에 있는 코드 값으로 변환 하는 방법
디코딩(Decoding) 인코딩과 반대로 문자를 문자셋에 따라 코드를 문자로 변환하는 방법
문자 인코딩 형태(Character
Encoding Form, CEF)
utf-8, utf-16과 같이 인코딩 하는 특정 방법을 의미 한다.
코드 페이지(Code Page) 인코딩 방식을 의미하며, 사용하는 문자 셋이나 플렛폼, 인코딩 방식에 따라
다른 번호가 부여 되어 있다.
2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형
ANSI 문자
유니코드 문자
2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형
WinNT.h
예시
3. 윈도우 내의 유니코드 함수와 ANSI 함수
Window NT 이후의 함수 사용
• W가 붙으면 유니코드를 이용하는 함수.
• A가 붙으면 ANSI를 이용하는 함수.
4. C런타임 라이브러리 내의 유니코드 함수와 ANSI 함수
TChar.h
• 가능한 _tcslen을 사용한다.
5. C런타임 라이브러리 내의 안전 문자열 함수
메모리 문제
• 문자열 종결 문자(0) 또한 하나의 문자이기 때문에 메모리가 오버되는 문제가 생긴다.
안전함수
• 함수명 뒤에 _s가 붙으며 파라미터로 문자열의 size가 추가됨.
5. C런타임 라이브러리 내의 안전 문자열 함수
• 위 함수를 정의함을써 Parameter의 유효성 검증 실패시에
에러내용을 전달 할 수있다.
Parameter 설명
expression C런타임 함수 내에서 발생한테스트 실패에 대해 설
명하는 문자열(L"Buffer is too small" && 0)
fuction 함수 이름
file 소스 파일 명
line 소스 코드의 행 번호
5. C런타임 라이브러리 내의 안전 문자열 함수
문자열 조작을 수행하는 동안 좀 더 많은 제어를 수행할 수 있도록 하는 방법
HRESULT 반환형은 다음 값들 중 하나를 반환한다.
HRESULT 반환 값 설명
S_OK 성공, 복사 대상 버퍼에 원본 문자열이 정상 복사되었으며, "0"로 문자열이 종결되었다.
STRSAFE_E_INVALID_P
ARAMETER
인자 값으로 NULL이 전달되었다.
STRSAFE_E_INSUFFICI
ENT_BUFFER
복사 대상 버퍼가 원본 문자열을 담기에 충분하지 않다
5. C런타임 라이브러리 내의 안전 문자열 함수
Parameter 설명
size_t *pcchRemaining 이 포인터는 복사 대상 버퍼 내에 사용되지 않은(남아 있는) 문자의 개수를 가져온다. 문자열 종결 문자인 '0' 은 개 수에 포함되
지 않는다.
LPTSTR* ppszDestEnd 만일 ppszDestEnd가 NULL이 아니라면 복사 대상 버퍼 내의 문자열 종결 문자인 '0'을 가리키게 된다.
DWORD dwFlags 아래 나열한 값들 중 하나 혹은 여러개를 '|'를 통해 전달한다
STRSAFE_FILL_BEHIND_NULL 함수가 성공하면 dwFlags의 하위 바이트를 통해 전달한 값을 이용하여 복사 대상 버퍼의 '0'이후의 나머지 공간을 채운다.
STRSAFE_IGNORE_NULLS NULL값을 가진 문자열 포인터를 비어 있는 문자열(TEXT(""))을 가리키는 포인터처럼 다룬다.
STRSAFE_FILL_ON_FAILURE 함수가 실패하면 dwFlags의 하위 바이트를 통해 전달한 값을 이용하여 비어있는 문자열을 표시하기 위한 '0'을 제외한 모든 공
간을 채운다.
STRSAFE_NULL_ON_FAILUR 만일 함수가 실패하면 비어 있는 문자열(TEXT(""))을 나타내기 위해 복사 대상 버퍼의 최초 문자를 '0'으로 설정한다. 만일
STRSAFE_E_INSUFFICIENT_BUFFER가 발생하는 경우 복사 대상 버퍼에 이미 복사된 잘린 문자열들이 있는 경우에도 덮어써진
다.
STRSAFE_NO_TRUNCTION SRSAFE_NULL_ON_FAILURE와 동일하게 함수가 실패하면 비어 있는 문자열(TEXT(""))을 나타내기 위해 복사 대상 버퍼의 최초
문자를 '0'으로 설정한다. 만일 STRSAFE_E_INSUFFICIENT_BUFFER가 발생하는 경우 복사 대상 버퍼에 이미 복사된 잘린 문자
열들이 있는 경우에도 덮어써진다.
5. C런타임 라이브러리 내의 안전 문자열 함수
LCID locale : 각 언어별로 고유한 32비트 값인 지역 ID(local ID)를 전달하면 된다.
윈도우의 GetThreadLocale 함수를 이용하면 호출한 스레드의 LCID값을 얻을 수 있다.
플래그 의미
NORM_IGNORECASE
LINGUISTIC_IGNORECASE
대소문자를 구분하지 않는다.
NORM_IGNOREKANATYPE 일본어의 히라가나와 가타카나를 구분하지 않는다.
NORM_IGNORENONSPACE
LINGUISTIC_IGNOREDIACRITIC
발음을 위한 특수 기호를 무시한다.
NORM_IGNORESYMBOLES 기호를 무시한다.
NORM_IGNOREWIDTH 1바이트로 구성된 문자'와 '2바이트로 구성된 동일한 문자'의 차이점을 무시한다.
SORT_STRINGSORT 구두점을 기호로 다룬다.
윈도우의 문자열 함수
5. C런타임 라이브러리 내의 안전 문자열 함수
• 지역설정을 고려하지 않고 값에 의한 비교만을 수행.
• 상대적으로 빠름.
• 유니코드만을 파라미터로 사용함에 주의.
윈도우의 문자열 함수
리턴값 설명
0 함수 호출 실패
CSTR_LESS_THAN(1) pStrin1 < pString2
CSTR_EQUAL(2) pString1 == pString2
CSTR_GREATER_THAN(3) pString1 > pString2
6. 왜 유니코드를 사용하는 것이 좋은가?
• 다른나라의 언어로 애플리케이션을 지역화하기 쉽다.
• 단일 바이너리(.exe나 DLL)파일로 모든 언어를 지원할 수 있다.
• 코드가 더 빠르게 수행되며 더 작은 메모리를 사용하기 때문에 효율성이 증대된다.
• 윈도우가 제공하는 모든 함수를 쉽게 사용할 수 있다. 몇몇의 윈도우 함수는
유니코드 문자나 문자열만을 받아들일 수 있도록 작성되었다.
• COM과의 상호 운용이 쉽다(COE은 유니코드 문자와 문자열을 사용한다.)
• 닷넷 프레임워크와 상호 운용이 쉽다.
• 리소스를 쉽게 다룰 수 있다.(리소스 내의 문자열은 모두 유니코드로 유지된다.)
7. 문자와 문자열 작업에 대한 권고사항
• 문자열을 char타입이나 byte의 배열로 생각하지 말고, 문자의 배열로 생각하라.
• 문자나 문자열을 나타낼 때 중립 자료형(TCHAR/PTSTR과 같은)을 사용해라.
• 바이트나 바이트를 가리키는 포인터, 데이터 버퍼 등을 표현하기 위해서는 명시적인 자료형(BYTE나 PBYTE와 같은)을 사용하라.
• 문자나 문자열 상수 값을 표현할 떄에는 TEXT나 _T매크로를 사용하라. 일관성과 가독성을 유지하기 위해 두 개의 매크로를 혼횽해서는 안된다.
• 문자나 문자열과 관련된 자료형을 애플리케이션 전반에 걸쳐 변경하라. (예를 들어 PSTR을 PTSTR로 변경)
• 문자열에 대한 산술적인 계산 부분을 수정하라. 예를 들어 보통의 함수들은 버퍼의 크기를 전달할 때 바이트 단위가 아닌 문자 단위로 값을 전달한다.
그렇기 때문에 sizeof(szBuffer)를 사용하는 대신 _countof(szBuffer)를 사용해야 된다. 또한 문자열을 저장하기 위한 메모리 블록을 할당해야 하고,
문자열의 구성하는 문자 개수를 알고 있는 경우 메모리 할당은 바이트 단위로 수행해야 한다. 즉 malloc(nCharacters)를 써서는 안되고, malloc(nCharacter
* sizeof(TCHAR))를 써야된다. 다음의 매크로를 정의해 두는것도 상당히 유용한 방법이다.
#define chmalloc(nCharacters) (TCHAR*)malloc(nCharacters*sizeof(TCHAR)
• printf 류의 함수를 사용하는 것을 피하라. ANSI 문자열을 유니코드 문자열로 변경하거나 반대로 수행하기 위해 %s나 %S 등을 사용하는 대신
MultByteToWideChar와 WideCharToMultiByte 함수를 사용하라.
• UNICODE와 _UNICODE심벌은 항상 동시에 정의하거나 해제하라.
8. 유니코드 문자열과 ANSI 문자열 사이의 변경
멀티바이트 문자열 -> 와이드 문자 문자열
Parameter 설명
uCodePage 새롭게 변경될 문자열과 관련된 코드 페이지 전달.
dwFlages 매개변수를 지정하면 문자열 변경 작업 이외의 추가적인 작업을 수행할 수 있
는데, 발음을 위한 특수기호와 시스템이 변경하지 못하는 특수동작을 지정한
다. 보통 매개변수로 0을 전달한다.
pMultiByteStr 변경할 문자열을 담고 있는 메모리 주소
cbMultiByte 버퍼의 최대 크기(바이트 단위), 매개변수로 -1을 전달하면 변경할 문자열의
길이를 자동으로 결정.
pWideCharStr 유니코드로 변경될 문자열을 저장하기 위한 메모리 버퍼의 주소.
cchWideChar 문자열의 길이(문자 단위), 매개변수를 0으로 함수를 호출하면 필요한 버퍼의
크기를 반환해 준다.
와이드 문자 문자열 -> 멀티바이트 문자열
8. 유니코드 문자열과 ANSI 문자열 사이의 변경
• MultiByteTo WideChar 함수에 비해 추가적으로 개의 매개변수
(pDefaultChar와 pfUsedDefaultChar 매개변수)를 더 필요로 한다는 점에 주의
Parameter 설명
pDefaultChar 와이 드 문자가 적절히 변경될 수 없는 경우 pDefaultChar 매개변수에 의해 지정된 문자로 대체된다. 대 부분의 사용 예와 같이
이 매개변수를 NULL로 지정하면 시스템 기본 문자인 물음표로 대체한다.
pfUsedDefaultChar p fUsedDefaultChar 매개변수에는 BOOL 값을 가리키는 포인터가 전달되며, 변경할 와이드-문자 문자열 중 한 자라도 멀티바
이트 문자 문자열로 변경하는 것이 실패하는 경우 TRUE 가 전달된다. 반 , 모든 문자열에 대해 변경이 성공적이면 FALSE를 반
환한다.
감사합니다

More Related Content

What's hot

MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)Jin wook
 
Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리ssuser7c5a40
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)Hoyoung Jung
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1Hoyoung Jung
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
Effective c++ item27
Effective c++ item27Effective c++ item27
Effective c++ item27진화 손
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터Hoyoung Jung
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리Hansol Kang
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부Gwangwhi Mah
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010MinGeun Park
 
150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁Ju-ri Seo
 
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)HYUNJEONG KIM
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)유익아카데미
 
HI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSHI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSJae-yeol Lee
 
해커스쿨 FTZ 문제 풀이
해커스쿨 FTZ 문제 풀이해커스쿨 FTZ 문제 풀이
해커스쿨 FTZ 문제 풀이fromitive
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기jaypi Ko
 

What's hot (20)

MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)MIPS CPU의 이해 (입문)
MIPS CPU의 이해 (입문)
 
Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리Refelction의 개념과 RTTR 라이브러리
Refelction의 개념과 RTTR 라이브러리
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1
 
3.포인터
3.포인터3.포인터
3.포인터
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
Effective c++ item27
Effective c++ item27Effective c++ item27
Effective c++ item27
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
모던 C++ 정리
모던 C++ 정리모던 C++ 정리
모던 C++ 정리
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
C++11
C++11C++11
C++11
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010
 
6 function
6 function6 function
6 function
 
150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁
 
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
알고리즘 연합캠프 세미나 3-C (C++11 and ETC)
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
 
HI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSHI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFS
 
해커스쿨 FTZ 문제 풀이
해커스쿨 FTZ 문제 풀이해커스쿨 FTZ 문제 풀이
해커스쿨 FTZ 문제 풀이
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
 

Similar to Windosw via c 스터디2장

델파이와 유니코드
델파이와 유니코드델파이와 유니코드
델파이와 유니코드Devgear
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부JiHyung Lee
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7Chris Ohk
 
포인터와 배열
포인터와 배열포인터와 배열
포인터와 배열Kim YoSep
 
어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법Daniel Kim
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉HyunJoon Park
 
파이썬 유니코드 이해하기
파이썬 유니코드 이해하기파이썬 유니코드 이해하기
파이썬 유니코드 이해하기Yong Joon Moon
 
프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2dktm
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기jaypi Ko
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 Yong Joon Moon
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)SeongHyun Ahn
 
Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트Jin wook
 
유니코드 세미나
유니코드 세미나유니코드 세미나
유니코드 세미나YoungGyu Chun
 

Similar to Windosw via c 스터디2장 (20)

델파이와 유니코드
델파이와 유니코드델파이와 유니코드
델파이와 유니코드
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
06장 함수
06장 함수06장 함수
06장 함수
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
 
포인터와 배열
포인터와 배열포인터와 배열
포인터와 배열
 
Unicode100
Unicode100Unicode100
Unicode100
 
어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉
 
파이썬 유니코드 이해하기
파이썬 유니코드 이해하기파이썬 유니코드 이해하기
파이썬 유니코드 이해하기
 
프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2프로그래밍 및 실습 Chap2
프로그래밍 및 실습 Chap2
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
 
Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트
 
유니코드 세미나
유니코드 세미나유니코드 세미나
유니코드 세미나
 
7그룹 코드
7그룹 코드7그룹 코드
7그룹 코드
 

More from HolyTak

14장 입자 시스템과 스트림 출력.pptx
14장 입자 시스템과 스트림 출력.pptx14장 입자 시스템과 스트림 출력.pptx
14장 입자 시스템과 스트림 출력.pptxHolyTak
 
Graphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptxGraphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptxHolyTak
 
Graphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptxGraphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptxHolyTak
 
Graphics 2장 행렬.pptx
Graphics 2장 행렬.pptxGraphics 2장 행렬.pptx
Graphics 2장 행렬.pptxHolyTak
 
Windosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptxWindosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptxHolyTak
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxHolyTak
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxHolyTak
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxHolyTak
 
Windosw via c 스터디17장
Windosw via c 스터디17장Windosw via c 스터디17장
Windosw via c 스터디17장HolyTak
 
Windosw via c 스터디12장
Windosw via c 스터디12장Windosw via c 스터디12장
Windosw via c 스터디12장HolyTak
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장HolyTak
 
Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장HolyTak
 

More from HolyTak (12)

14장 입자 시스템과 스트림 출력.pptx
14장 입자 시스템과 스트림 출력.pptx14장 입자 시스템과 스트림 출력.pptx
14장 입자 시스템과 스트림 출력.pptx
 
Graphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptxGraphics 14장 1인칭 카메라 만들기.pptx
Graphics 14장 1인칭 카메라 만들기.pptx
 
Graphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptxGraphics 8장 텍스처 적용.pptx
Graphics 8장 텍스처 적용.pptx
 
Graphics 2장 행렬.pptx
Graphics 2장 행렬.pptxGraphics 2장 행렬.pptx
Graphics 2장 행렬.pptx
 
Windosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptxWindosw via c 스터디26장.pptx
Windosw via c 스터디26장.pptx
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptx
 
Windosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptxWindosw via c 스터디23장.pptx
Windosw via c 스터디23장.pptx
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptx
 
Windosw via c 스터디17장
Windosw via c 스터디17장Windosw via c 스터디17장
Windosw via c 스터디17장
 
Windosw via c 스터디12장
Windosw via c 스터디12장Windosw via c 스터디12장
Windosw via c 스터디12장
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
 
Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장Windosw via c/c++ 스터디5장
Windosw via c/c++ 스터디5장
 

Windosw via c 스터디2장

  • 2. 1. 문자 인코딩 문자 인코딩 관련 용어 문자셋(Character-Set) 그래픽 문자의 집합으로 하나의 그래픽 문자는 그 문자를 나타내는 숫자에 대응된다. 숫자와 그래픽 문자가 대응되는 하나의 테이블. (ex. ASCII코드표) 인코딩(Encoding) 문자를 다른 문자셋에 있는 코드 값으로 변환 하는 방법 디코딩(Decoding) 인코딩과 반대로 문자를 문자셋에 따라 코드를 문자로 변환하는 방법 문자 인코딩 형태(Character Encoding Form, CEF) utf-8, utf-16과 같이 인코딩 하는 특정 방법을 의미 한다. 코드 페이지(Code Page) 인코딩 방식을 의미하며, 사용하는 문자 셋이나 플렛폼, 인코딩 방식에 따라 다른 번호가 부여 되어 있다.
  • 3. 2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형 ANSI 문자 유니코드 문자
  • 4. 2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형 WinNT.h 예시
  • 5. 3. 윈도우 내의 유니코드 함수와 ANSI 함수 Window NT 이후의 함수 사용 • W가 붙으면 유니코드를 이용하는 함수. • A가 붙으면 ANSI를 이용하는 함수.
  • 6. 4. C런타임 라이브러리 내의 유니코드 함수와 ANSI 함수 TChar.h • 가능한 _tcslen을 사용한다.
  • 7. 5. C런타임 라이브러리 내의 안전 문자열 함수 메모리 문제 • 문자열 종결 문자(0) 또한 하나의 문자이기 때문에 메모리가 오버되는 문제가 생긴다. 안전함수 • 함수명 뒤에 _s가 붙으며 파라미터로 문자열의 size가 추가됨.
  • 8. 5. C런타임 라이브러리 내의 안전 문자열 함수 • 위 함수를 정의함을써 Parameter의 유효성 검증 실패시에 에러내용을 전달 할 수있다. Parameter 설명 expression C런타임 함수 내에서 발생한테스트 실패에 대해 설 명하는 문자열(L"Buffer is too small" && 0) fuction 함수 이름 file 소스 파일 명 line 소스 코드의 행 번호
  • 9. 5. C런타임 라이브러리 내의 안전 문자열 함수 문자열 조작을 수행하는 동안 좀 더 많은 제어를 수행할 수 있도록 하는 방법 HRESULT 반환형은 다음 값들 중 하나를 반환한다. HRESULT 반환 값 설명 S_OK 성공, 복사 대상 버퍼에 원본 문자열이 정상 복사되었으며, "0"로 문자열이 종결되었다. STRSAFE_E_INVALID_P ARAMETER 인자 값으로 NULL이 전달되었다. STRSAFE_E_INSUFFICI ENT_BUFFER 복사 대상 버퍼가 원본 문자열을 담기에 충분하지 않다
  • 10. 5. C런타임 라이브러리 내의 안전 문자열 함수 Parameter 설명 size_t *pcchRemaining 이 포인터는 복사 대상 버퍼 내에 사용되지 않은(남아 있는) 문자의 개수를 가져온다. 문자열 종결 문자인 '0' 은 개 수에 포함되 지 않는다. LPTSTR* ppszDestEnd 만일 ppszDestEnd가 NULL이 아니라면 복사 대상 버퍼 내의 문자열 종결 문자인 '0'을 가리키게 된다. DWORD dwFlags 아래 나열한 값들 중 하나 혹은 여러개를 '|'를 통해 전달한다 STRSAFE_FILL_BEHIND_NULL 함수가 성공하면 dwFlags의 하위 바이트를 통해 전달한 값을 이용하여 복사 대상 버퍼의 '0'이후의 나머지 공간을 채운다. STRSAFE_IGNORE_NULLS NULL값을 가진 문자열 포인터를 비어 있는 문자열(TEXT(""))을 가리키는 포인터처럼 다룬다. STRSAFE_FILL_ON_FAILURE 함수가 실패하면 dwFlags의 하위 바이트를 통해 전달한 값을 이용하여 비어있는 문자열을 표시하기 위한 '0'을 제외한 모든 공 간을 채운다. STRSAFE_NULL_ON_FAILUR 만일 함수가 실패하면 비어 있는 문자열(TEXT(""))을 나타내기 위해 복사 대상 버퍼의 최초 문자를 '0'으로 설정한다. 만일 STRSAFE_E_INSUFFICIENT_BUFFER가 발생하는 경우 복사 대상 버퍼에 이미 복사된 잘린 문자열들이 있는 경우에도 덮어써진 다. STRSAFE_NO_TRUNCTION SRSAFE_NULL_ON_FAILURE와 동일하게 함수가 실패하면 비어 있는 문자열(TEXT(""))을 나타내기 위해 복사 대상 버퍼의 최초 문자를 '0'으로 설정한다. 만일 STRSAFE_E_INSUFFICIENT_BUFFER가 발생하는 경우 복사 대상 버퍼에 이미 복사된 잘린 문자 열들이 있는 경우에도 덮어써진다.
  • 11. 5. C런타임 라이브러리 내의 안전 문자열 함수 LCID locale : 각 언어별로 고유한 32비트 값인 지역 ID(local ID)를 전달하면 된다. 윈도우의 GetThreadLocale 함수를 이용하면 호출한 스레드의 LCID값을 얻을 수 있다. 플래그 의미 NORM_IGNORECASE LINGUISTIC_IGNORECASE 대소문자를 구분하지 않는다. NORM_IGNOREKANATYPE 일본어의 히라가나와 가타카나를 구분하지 않는다. NORM_IGNORENONSPACE LINGUISTIC_IGNOREDIACRITIC 발음을 위한 특수 기호를 무시한다. NORM_IGNORESYMBOLES 기호를 무시한다. NORM_IGNOREWIDTH 1바이트로 구성된 문자'와 '2바이트로 구성된 동일한 문자'의 차이점을 무시한다. SORT_STRINGSORT 구두점을 기호로 다룬다. 윈도우의 문자열 함수
  • 12. 5. C런타임 라이브러리 내의 안전 문자열 함수 • 지역설정을 고려하지 않고 값에 의한 비교만을 수행. • 상대적으로 빠름. • 유니코드만을 파라미터로 사용함에 주의. 윈도우의 문자열 함수 리턴값 설명 0 함수 호출 실패 CSTR_LESS_THAN(1) pStrin1 < pString2 CSTR_EQUAL(2) pString1 == pString2 CSTR_GREATER_THAN(3) pString1 > pString2
  • 13. 6. 왜 유니코드를 사용하는 것이 좋은가? • 다른나라의 언어로 애플리케이션을 지역화하기 쉽다. • 단일 바이너리(.exe나 DLL)파일로 모든 언어를 지원할 수 있다. • 코드가 더 빠르게 수행되며 더 작은 메모리를 사용하기 때문에 효율성이 증대된다. • 윈도우가 제공하는 모든 함수를 쉽게 사용할 수 있다. 몇몇의 윈도우 함수는 유니코드 문자나 문자열만을 받아들일 수 있도록 작성되었다. • COM과의 상호 운용이 쉽다(COE은 유니코드 문자와 문자열을 사용한다.) • 닷넷 프레임워크와 상호 운용이 쉽다. • 리소스를 쉽게 다룰 수 있다.(리소스 내의 문자열은 모두 유니코드로 유지된다.)
  • 14. 7. 문자와 문자열 작업에 대한 권고사항 • 문자열을 char타입이나 byte의 배열로 생각하지 말고, 문자의 배열로 생각하라. • 문자나 문자열을 나타낼 때 중립 자료형(TCHAR/PTSTR과 같은)을 사용해라. • 바이트나 바이트를 가리키는 포인터, 데이터 버퍼 등을 표현하기 위해서는 명시적인 자료형(BYTE나 PBYTE와 같은)을 사용하라. • 문자나 문자열 상수 값을 표현할 떄에는 TEXT나 _T매크로를 사용하라. 일관성과 가독성을 유지하기 위해 두 개의 매크로를 혼횽해서는 안된다. • 문자나 문자열과 관련된 자료형을 애플리케이션 전반에 걸쳐 변경하라. (예를 들어 PSTR을 PTSTR로 변경) • 문자열에 대한 산술적인 계산 부분을 수정하라. 예를 들어 보통의 함수들은 버퍼의 크기를 전달할 때 바이트 단위가 아닌 문자 단위로 값을 전달한다. 그렇기 때문에 sizeof(szBuffer)를 사용하는 대신 _countof(szBuffer)를 사용해야 된다. 또한 문자열을 저장하기 위한 메모리 블록을 할당해야 하고, 문자열의 구성하는 문자 개수를 알고 있는 경우 메모리 할당은 바이트 단위로 수행해야 한다. 즉 malloc(nCharacters)를 써서는 안되고, malloc(nCharacter * sizeof(TCHAR))를 써야된다. 다음의 매크로를 정의해 두는것도 상당히 유용한 방법이다. #define chmalloc(nCharacters) (TCHAR*)malloc(nCharacters*sizeof(TCHAR) • printf 류의 함수를 사용하는 것을 피하라. ANSI 문자열을 유니코드 문자열로 변경하거나 반대로 수행하기 위해 %s나 %S 등을 사용하는 대신 MultByteToWideChar와 WideCharToMultiByte 함수를 사용하라. • UNICODE와 _UNICODE심벌은 항상 동시에 정의하거나 해제하라.
  • 15. 8. 유니코드 문자열과 ANSI 문자열 사이의 변경 멀티바이트 문자열 -> 와이드 문자 문자열 Parameter 설명 uCodePage 새롭게 변경될 문자열과 관련된 코드 페이지 전달. dwFlages 매개변수를 지정하면 문자열 변경 작업 이외의 추가적인 작업을 수행할 수 있 는데, 발음을 위한 특수기호와 시스템이 변경하지 못하는 특수동작을 지정한 다. 보통 매개변수로 0을 전달한다. pMultiByteStr 변경할 문자열을 담고 있는 메모리 주소 cbMultiByte 버퍼의 최대 크기(바이트 단위), 매개변수로 -1을 전달하면 변경할 문자열의 길이를 자동으로 결정. pWideCharStr 유니코드로 변경될 문자열을 저장하기 위한 메모리 버퍼의 주소. cchWideChar 문자열의 길이(문자 단위), 매개변수를 0으로 함수를 호출하면 필요한 버퍼의 크기를 반환해 준다.
  • 16. 와이드 문자 문자열 -> 멀티바이트 문자열 8. 유니코드 문자열과 ANSI 문자열 사이의 변경 • MultiByteTo WideChar 함수에 비해 추가적으로 개의 매개변수 (pDefaultChar와 pfUsedDefaultChar 매개변수)를 더 필요로 한다는 점에 주의 Parameter 설명 pDefaultChar 와이 드 문자가 적절히 변경될 수 없는 경우 pDefaultChar 매개변수에 의해 지정된 문자로 대체된다. 대 부분의 사용 예와 같이 이 매개변수를 NULL로 지정하면 시스템 기본 문자인 물음표로 대체한다. pfUsedDefaultChar p fUsedDefaultChar 매개변수에는 BOOL 값을 가리키는 포인터가 전달되며, 변경할 와이드-문자 문자열 중 한 자라도 멀티바 이트 문자 문자열로 변경하는 것이 실패하는 경우 TRUE 가 전달된다. 반 , 모든 문자열에 대해 변경이 성공적이면 FALSE를 반 환한다.

Editor's Notes

  1. 목차입니다.
  2. 과거에는 문자열을 0으로 끝나는 1Byte의 문자의 집합이라 생각했으나 몇몇 언어에 따라 상당히 많은 문자들로 구성되어 있어 1바이트로 나타낼 수 있는 256가지의 경우의 수를 초과하는 문제가 생긴다. 이러한 문제를 지원하기 위해 DBCS라는 문자셋이 나왔는데 이는 각각의 문자가 1바이트 혹은 2바이트가 될수 있기때문에 문제가 많았다. 이후, 윈도우 함수와 C런타임 라이브러리 함수들이 유니코드를 지원하게 되었기 때문에 DBCS는 사용하지 않는다. 라는 내용이 있으나 불필요한 내용이라 기본적인 것들을 정리해 봤다. 인코딩은 원래 기존형태를 어떠한 처리과정을 통해 변환시키는 과정을 의미하며 여기서도 같은 맥락으로 사용된다. 인코딩 폼은 인코딩을 변환하는 과정이라 한다면 인코딩 형태는 기법이라고 생각하면 될 것 같다. 코드페이지는 예를 들면 cp 949번은 한글 윈도우에서 제공하는 형식으로 숫자나 알파벳은 1byte로, 한글은 2byte로 나타낸다. 또한 932는 일본어페이지, 862는 히브리어인 것 처럼 언어 혹은 표기법에 따라 다른 페이지 번호를 가지고 있다
  3. ANSI 문자와 유니코드 문자에 자료형과 사용법 입니다. 컴파일 시 ANSI 나 유니코드를 사용하도록 변경 가능하게 소스 코드를 작성하는 것도 가능하다. 문자열 앞의 대문자 L은 컴파일러가 문자열을 유니코드로 다루도록 한다.
  4. C언어의 자료형으로부터 윈도우 자신의 자료형을 구분짓기 위해 WinNT.h 헤더파일은 다음과 같이 자료형을 정의하고있다. 또한 문자와 문자열을 가리키는 포인터 자료형에 대해 다음과 같이 정의하고 있다. 컴파일 시 ANSI 나 유니코드를 사용하도록 변경 가능하게 소스 코드를 작성하는 것도 가능하다. WinNT.h 헤더 파일을 보면 다음과 같은 자료형과 매크로가 정의되어 있다.
  5. 윈도우NT 이후의 모든 윈도우 버전은 유니코드를 바탕으로 작성되었다. 따라서 모든 핵심 함수들은 모두 유니코드 문자열을 요구한다. 만일 윈도우 함수에게 ANSI문자열을 전달하면 호출된 함수는 먼저 전달된 ANSI문자열을 유니코드로 변경하고 변경된 문자열은 운영체제에 전달한다. 만일 ANSI로 반환되기를 기대하는 함수가 있다면 유니코드를 ANSI문자열로 변경한 후 반환한다. 윈도우는 문자열 인자를 가지는 함수를 제공해야 할 경우 두가지 버전으로 존재한다. W가 뒤에 붙어 있으면 유니코드 문자열을 인자로 취하는 버전이다. 끝의 W는 Wide를 의미한다. A가 뒤에 있으면 ANSI 문자열을 인자로 취하는 버전이다. 예를들면 보통 W나 A를 직접 쓰지 않고 코드를 작성하게 될것이다. 각 함수의 헤더파일을 보게되면 다음과 같은 식으로 매크로가 정의되어 있다.
  6. 윈도우 함수와 마찬가지로 C 런타임 라이브러리도 ANSI 문자열을 다루는 함수와 유니코드 문자열을 다루는 함수를 세트로 제공하고 있다. 하지만 윈도우 함수와는 다르게 C런타임 라이브러리가 제공하는 ANSI함수는 여전히 잘 작동하고 유니코드로 변경을 수행하지 않을 뿐더러 내부적으로 유니코드 버전의 함수를 호출하지도 않는다. C런타임 라이브러리의 대표적인 함수로 ANSI문자열의 길이를 반환하는 strlen함수와 유니코드 문자열에 대해 동일한 기능을 수행하는 wcslen함수가 있다. ANSI와 유니코드 환경에서 모두 컴파일 될 수 있는 코드를 작성하려면 다음과 같은 매크록 정의되어 있는 TChar.h헤더 파일도 참조해야 한다. 가능한 한 _tcslen을 사용하는 것이 좋다. 왜냐하면 _UNICODE가 선언되어 있다면 자동적으로 wsclen으로 변경되고, 그렇지 않으면 strlen으로 변경된다.
  7. 문자열을 다루는 함수는 항시 잠재적인 위험에 노출되어 있다. 만일 결과를 담기 위한 문자열 버퍼가 결과를 충분히 담기에 충분하지 않다면 메모리 관련문제가 발생할 것이다. strcpy와 wcscpy함수(그리고 대부분의 다른 문자열 조작 함수)의 문제점은 버퍼의 최대 크기를 인자로 받지 않는다는 것이다. 그래서메모리 문제가 생겨도 에러 보고를 받을 수 없고 제대로 운용되고 있는지를 알 방법도 없다는 것이 문제다. StrSafe.h 헤더 파일을 포함하면 String.h 헤더 파일도 같이 포함딘다. StrSafe.h 헤더 파일은 C런타임 라이브러리에 포함되어 있는 _tcscpy 매크와 같은 기존의 문자열 처리 함수를 사용할 경우 더 이상 사용되지 않는 함수라는 경고를 나타낼 수 있도록 설정되어 있다. _tcscpy나 _tcscat 같은 기존 함수에는 동이란 이름에 _s가 붙은 안전 문자열 함수가 제공된다. 안전(_s 로 끝나는) 문자열 함수는 먼저 인자의 유효성을 검증한다. 인자의 값이 NULL인지, 정수 값이 유호한 범위 내에 있는지, 열거형 값이 유효한지, 버퍼는 충분한지 등을 테스트한다. 만일 테스트가 실패하면 스레드 지역 저장소 변수인 errno에 에러 코드를 설정하고, 성공 실패 여부를 나타내는 errno_t형 값을 반환한다. 디버그 빌드의 경우 함수를 반환하기에 앞서 사용자에게 어설션 다이얼로그 박스를 표시하고 애플리케이션을 종료한다. 릴리즈 빌드의 경우 이러한 단계 없이 바로 애프리케이션을 종료한다.
  8. C 런타임 라이브러리는 인자의 유효성 검증이 실패하였을 경우 사용자가 정의한 함수를 통해 에러 내용을 전달할 수 있는 기능을 제공하고 있다. 이러한 함수를 이용하면 에러를 기록하거나 디버거를 기동하는 등의 사용자 작업을 수행할수 있다. 이를 위해서는 먼저 다음과 같은 원형의 함수를 작성해야 한다.
  9. 모든 함수가 함수명에 "Cch"를 포함하고 있음에 주목하자. "Cch"는 Count of characters(문자의 개수)를 의미하며, 보통의 경우 _countof 매크로를 이용하면 적절한 값을 전달할 수 있다. StringCbCat, StringCbCopy, StringCbPrintf와 같이 함수명에 "Cb"를 포함하고 있는 함수들도 있다. 이러한 함수 인자로 Count of bytes(바이트 수)를 요구하며, 보통의 경우 sizeof연산자를 이용하면 적절한 값을 전달할 수 있다. _s로 끝나는 안전 문자열 함수와 달리 이러한 함수들은 버퍼가 충분하지 않을 경우 문자 잘림이 수행되며 이때 STRSAFE_E_INSUFFICIENT_BUFFER값이 반환된다. StrSafe.h 파일 확인해보면 SUCCEEDED/FAILED 매크로를 이용하여 실패 여부를 확인할 수 있다.
  10. 문자열 간의 비교나 정렬 등은 매우 일반적인 작업들인데, 이를 위한 최상의 함수는 CompareString(Ex)와 CompareStringOrdinal이다. 문자열 비교를 위해 CompareString(Ex)를 사용하면 언어적으로 올바른 비교를 수행할 수 있다. pString, cch : 비교 할 문자열 및 문자열 개수(바이트 아님) 만일 cch로 음수 값을 주면 pString이 0으로 끝나는 문자열이라고 가정한다
  11. 이 함수는 지역 설정은 고려하지 않고 단순히 값에 의한 비교만을 수행하기 때문에 상대적으로 빠르게 수행된다. 프로그램 내에서만 사용하는 문자열은 최종 사용자에게 보여지지 않는 경우가 대부분이므로 이 함수를 사용하는 것이 가장 좋다. 이 함수는 유니코드 문자열만을 인자로 취한다는 점에서 주의하기 바란다. CompareString(Ordinal)은 C런타임 라이브러리의 *cmp형태의 문자열 비교 함수의 반환값과 달리 0을 반환하면 이것은 함수 호출이 실패했음을 말한다. CSTR_LESS_THAN(1)은 pString1이 pString2보다 작다는 의미이다. CSTR_EQUAL(2)은 pString1고 pString2가 같다는 의미이며, CSTR_GREATER_THAN(3)은 pString1이 pString2보다 크다는 의미이다. 반환값에서 -2를 하면 C런타임 라이브러리의 반환값(-1, 0, +1)과 동일한 의미를 가지게 된다.
  12. 1, pWideCharStr 매개변수에 NULL, cchWideChar 매개변수에 0, cbMultiByte 매개변수에 -1 을주 어 MultiByteTo WideChar 함수를 호출한다. 2 유니코드 문자열 Unicode slring 로의 변경에 필요한 충분한 메모리 공간을 할당한다. 이 크기는 앞서 호출한 MultiByteToWideChar 함수의 반환 값에 sizeof(wchar _t)를 곱한 값을 근간으로 계산될 수 있다. 3, MultiByteToWideChar 함수를 재호출한다. 이번에는 pWideCharStr에 할당된 버퍼의 주소를 전달 하고, cch WideChar에 앞서 호출한 MultiByteTo WideChar 함수의 반환 값을 전달한다. 4, 변경된유니묘드문자열을시용한다. 5, 유니코드 문자열에 의해 점유된 메모리 공간을 해제한다.
  13. WideCharToMultiByte 함수는 MultiByteTo WideChar 함수에 비해 추가적으로 개의 매개변수 (pDefaultChar와 pfUsedDefaultChar 매개변수)를 더 필요로 한다는 점에 주의해야 한다. WideCharToMultiByte 함수에 의해서만 사용되는 이러한 매개변수들은 변경할 와이드 문자 e haracl 가 uCodepage 에 의해 지정된 코드 페이지 내에 적절한 문자가 존재하지 않을 경우에 사용된다. 와이 드 문자가 적절히 변경될 수 없는 경우 pDefaultChar 매개변수에 의해 지정된 문자로 대체된다. 대 부분의 사용 예와 같이 이 매개변수를 NULL로 지정하면 시스템 기본 문자인 물음표로 대체한다. 이 러한 변경 방식은 파일명에서와 같이 물음표가 와일드카드 문자wildcard bara er 로 사용되는 경우에 적용 되면매우위험하다. p fUsedDefaultChar 매개변수에는 BOOL 값을 가리키는 포인터가 전달되며, 변경할 와이드-문자 문자열 중 한 자라도 멀티바이트 문자 문자열로 변경하는 것이 실패하는 경우 TRUE 가 전달된다. 반 , 모든 문자열에 대해 변경이 성공적이면 FALSE를 반환한다. 함수 호출 이후에 이 값을 확인함으 로써 와이드-문자 문자열이 완벽히 성공적으로 변경되었는지의 여부를 확인할 수 있다. 하지만 이 매개변수로는 NULL을 전달하는 것이 일반적이다.