์ด ํฌ์คํ
์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค.
๋ฐฑํ (bektekk@yahoo.co.kr)
ํํ์ด์ง : http://bektekk.wo.to
๋ฌธ์์ด(์คํธ๋ง) ์ ๊ฒฉ ๋ถ์ 2๊ฐ
๋ณธ๊ฐ์ข๋ ์ฝ๋ ํ๋ก์ ํธ์ ์ ๊ฐ ์ข์ํ๋ ํ๋ก๊ทธ๋๋จธ์ธ Michael Dunn์ ๊ฐ์ข
The Complete Guide to C++ Strings, Part I ๊ณผ II ๋ฅผ ๋ฒ์ญํ ๊ธ์
๋๋ค.
์ต๋ํ ์์ญ์ ํ๋ ค๊ณ ๋
ธ๋ ฅํ์ง๋ง, ์ด๋ฐ์ชฝ์ ๊ฒฝํ์ด ๋ถ์กฑํ๋ค ๋ณด๋ ๋ง์ด ๋ชจ์๋
๊ฐ์ข๊ฐ ๋๊ฒ ์ง๋ง, ๋ง์ ๋์์ด ๋์
จ์ผ๋ฉด ํฉ๋๋ค.
๊ธฐํ ๋ฌธ์ ์ฌํญ์ด๋ ์ง๋ฌธ์ ์ชฝ์ง๋ ๋ฉ์ผ์ ์ด์ฉํด ์ฃผ์
จ์ผ๋ฉด ํฉ๋๋ค.
๋ณธ๊ฐ์ข๋ ์ ํํ์ด์ง(์์ ๋งํฌ)๋ฅผ ํตํด์๋ ๋ณด์ค์ ์์ต๋๋ค.
์ด๋ฒ๊ฐ ๊น์ง๊ฐ ์ข ์ง๋ฃจํ๊ฒ ๋ค์.
๋ค์๊ฐ ๋ถํฐ๋ ์ค์ ํด๋์ค๋ค์ ๋ค๋ฃจ์ด์ ์กฐ๊ธ์ ๋ ์ง๋ฃจํ ๊ฑฐ๋ผ ์๊ฐ๋ฉ๋๋ค.
์คํธ๋ง์ ์กฐ์ํ๊ธฐ^^
์ฐ๋ฆฌ๋ ์ฒ์ C๋ฅผ ๋ฐฐ์ธ๋ ๋ถํฐ SBCS ์คํธ๋ง์ ์ฌ์ฉํ๋๋ฐ ์ต์ํด์ ธ ์์ต๋๋ค. strlen() ๊ฐ์ ํจ์๋ ์๋ง ์ฒ์ C๊ณต๋ถํ์ค๋ ๋๊ตฌ๋ ์จ๋ณด์ จ์ ๊ฒ์ด๊ณ ์์ง๋ ์ฐ์๊ณ ๊ณ์ค๊ฒ๋๋ค. ๋ํ ์ด๋ณดํฐ๋ฅผ ๋ง ๋ฒ์๋ char* ํ์ ์ ์ด์ฉํด ++, -- ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ฐ๋ฉด์ ๋ฌธ์์ด ์กฐ์๋ค์ ํด๋ดค์๊ฒ๋๋ค. ๋ํ [] ์์ ๋ฐฐ์ดํํ๋ฒ์ผ๋ก ์บ๋ฆญํฐ ํ๋์ฉ ๊ฐ์ ์ป์ด์ค๋ ๊ฒ์๋ ์ด๋ฏธ ์ต์ํ์ค ๊ฒ๋๋ค. ์ด๋ฐ ์ผ๋ จ์ ์์ ๋ค์ SBCS ๋ Unicode ์คํธ๋ง์์๋ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค. ์๋ํ๋ฉด ๋ชจ๋ ์บ๋ฆญํฐ๋ ๊ฐ์ ๊ธธ์ด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. SBCS์์๋ 1๋ฐ์ดํธ ์ ๋์ฝ๋์์๋ 2๋ฐ์ดํธ ์ด๊ธฐ ๋๋ฌธ์ด์ฃ .
ํ์ง๋ง, ์ฐ๋ฆฌ๋ DBCS ์ฆ, 2๋ฐ์ดํธ์ด์์ ์บ๋ฆญํฐ๋ค์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์ด๋ฐ ์ต๊ด๋ค์ ๋ฐ๋์ ๋ฒ๋ ค์ผ ํฉ๋๋ค. ๋ง์ฝ DBCS ์คํธ๋ง์ ์ธ๋์๋ ๋ฐ๋์ ๋ฐ๋ผ์ผ ํ ๋๊ฐ์ง์ ๋ฃฐ์ด ์์ต๋๋ค. ์ด ๋ฃฐ์ ์ด๊ธฐ๋ฉด ์ผ๊ทผ์ด ๋ฒ๊ทธ ์ก๋๋ผ ์ข์ํ๋ ๋๋ผ๋ง๋ ๋ชป๋ณด์๊ณ , ์ผ๊ทผ ํ๋ด, ๋จธ๋ฆฌ ๋น ์ง๋ด ๊ณ ์๋ค์ด ๋ง์ผ์ค ๊ฒ๋๋ค. ^^ (๋๋ฌด ์ฅํฉํ๊ฒ ๋์ด๋์๋ค์)
์ฒซ์งธ, Lead Byte๋ฅผ ์ฑํฌํด์ง ์์๊ฑฐ๋ฉด ์ ๋ ++ ํฌ์ธํฐ ์ฐ์ฐ์ ํ์ง๋ง๊ฒ
๋์งธ. ์ ๋ ์ ๋ -- ํฌ์ธํฐ ์ฐ์ฐ์ ํ์ง ๋ง๊ฒ
๋จผ์ ๋๋ฒ์งธ ๋ฃฐ์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค. ์๋ํ๋ฉด ์ค๋ช
ํ๊ธฐ ์ฝ๊ธฐ๋๋ฌธ์^^. ์ฌ๋ฌ๋ถ์ด ์ค์ ํ์ผ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ค๊ณ ๊ฐ์ ํฉ์๋ค. ์คํํ๋ฉด ๊ทธ ํ๋ก๊ทธ๋จ์ ๊ทธ ์ค์ ํ์ผ์ ์ฝ์ด์ ์์
ํ๊ฒ์ฃ ? ๋ง์ฝ ํ๋ก๊ทธ๋จ์ ๊ฒฝ๋ก๊ฐ C:\Program Files\MyCoolApp
์ด๊ณ , ์ค์ ํ์ผ์ C:\Program Files\MyCoolApp\config.bin
์ ์์ต๋๋ค.
๊ทธ๋ผ ์ค์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ป์ด์ค๋ ํจ์๋ฅผ ์ด๋ ๊ฒ ์์ฑํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
bool GetConfigFileName ( char* pszName, size_t nBuffSize ) { char szConfigFilename[MAX_PATH]; // ์ธ์คํจ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ป์ด์จ๋ค. // ..... // ๋ง์ฝ ๋ง์ง๋ง ์บ๋ฆญํฐ๊ฐ ๋ฐฑ์ฌ๋์๊ฐ ์๋๋ฉด ์ถ๊ฐํด ์ค๋ค. // ์ฐ์ ๋ง์ง๋ง ์บ๋ฆญํฐ๋ฅผ ๊ตฌํ๋ค. char* pLastChar = strchr ( szConfigFilename, '\0' ); // *** ์ ํ์นธ ์์ผ๋ก ๊ฐ์ *** pLastChar--; // ๋ฐฑ ์ฌ๋์ ์ถ๊ฐ if ( *pLastChar != '\\' ) strcat ( szConfigFilename, "\\" ); // ์ค์ ํ์ผ ๋๋ ํ ๋ฆฌ ๋์ ํ์ผ๋ช ์ถ๊ฐ strcat ( szConfigFilename, "config.bin" ); // ๋ฆฌํด if ( strlen ( szConfigFilename ) >= nBuffSize ) return false; else { strcpy ( pszName, szConfigFilename ); return true; } }
์ด ๋ฃจํด์ ์์ง์ฌ์ก์ต๋๋ค. ๊ทธ๋ฌ๋ ํน์ ํ DBCS์บ๋ฆญํฐ์์๋ ์ ๋๋ก ์๋ํ์ง ์์ ๊ฒ์
๋๋ค. ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ง์ฝ ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ด "C:\
๋๋ ํ ๋ฆฌ" ์ ๊ฐ๋ค๊ณ ๊ฐ์ ํด ๋ณด๋ฉด. ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๊ฒ ๋ฉ๋๋ค. :
43
3A
5C
83 88
83 45
83 52
83 5C
00
LB TB
LB TB
LB TB
LB TB
C
:
\
๋
๋
ํ
๋ฆฌ
EOS
GetConfigFileName()
ํจ์๊ฐ ๋ง์ง๋ง ๋ฐฑ์ฌ๋์๋ฅผ ํ์ธํ ๋ ๋ง์ง๋ง 0์ด ์๋ ๋ฐ์ดํธ๋ฅผ ํ์ธํ๋๊ฑธ ๋ณผ์๊ฐ ์์ผ์ค ๊ฒ๋๋ค. (--ํฌ์ธํฐ ์ฐ์ฐ์ผ๋ก) ๊ทธ๋ฆฌ๊ณ ๊ฐ์ด '\\' ์ธ์ง == ์ฐ์ฐ์๋ก ํ์ธํ์ง๋ง ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ์ด ๋ฃจํด์ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
๊ทธ๋ผ ๋ฌด์์ด ์๋ชป ๋์์๊ฐ์? ์์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์ ํ๋์์ผ๋ก ํ์ํ ๋ ๋ฐ์ดํธ๋ฅผ ์ดํด๋ณด๋ฉด ๋ฐฑ์ฌ๋์์ ๊ฐ์ 0x5C์ด๊ณ '๋ฆฌ'์ ๊ฐ์ 83 5C ์ ๋๋ค. (๋ฌด์ธ๊ฐ ๋์น ์ฑ์ จ๊ฒ ์ฃ ?.. ^^) ์์ ๋ฃจํด์ '๋ฆฌ'์ TB์ฆ Trail Byte๋ง์ ์ฝ๊ณ '\\'์ ๊ฐ์ ๊ฐ์ผ๋ก ๊ฐ์ฃผํด ๋ฒ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์์ ์ฝ๋๋ฅผ ์์ ํ๋ ค๋ฉด --ํฌ์ธํฐ ์ฐ์ฐ์ ์ ๊ฑฐํ๊ณ ๊ทธ์ ์์ํ๋ DBCS๋ฅผ ์ง์ํ๋ ํจ์๋ก ๋์ฒด ํ๋ ๊ฒ์ ๋๋ค. ์์ ํ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค. :
bool FixedGetConfigFileName ( char* pszName, size_t nBuffSize ) { char szConfigFilename[MAX_PATH]; char* pLastChar = _mbschr ( szConfigFilename, '\0' ); // ์ ์ด์ ์ ๋๋ก ๋๋ค. // ์ด์ ์บ๋ฆญํฐ๋ก ์ด๋ํ๋ค. ์ด๊ฒ์ 1๋ฐ์ดํธ ์ผ์๋ ์๊ณ // 2๋ฐ์ดํธ ์ผ์๋ ์๋ค. pLastChar = CharPrev ( szConfigFilename, pLastChar ); if ( *pLastChar != '\\' ) _mbscat ( szConfigFilename, "\\" ); _mbscat ( szConfigFilename, "config.bin" ); if ( _mbslen ( szInstallDir ) >= nBuffSize ) return false; else { _mbscpy ( pszName, szConfigFilename ); return true; } }
์์ ์์ ๋ ๋ฃจํด์ ํ ์บ๋ฆญํฐ ์ ์ผ๋ก ๊ฐ๊ธฐ ์ํด CharPrev()
API ํจ์๋ฅผ ์ด์ฉํ์ต๋๋ค. ๊ทธ ํ ์บ๋ฆญํฐ๋ ์์ ์์์์ ๊ฐ์ด 2๋ฐ์ดํธ๋ฅผ ์ฐจ์งํ ์๋ ์๊ณ , 1๋ฐ์ดํธ ์ผ์๋ ์์ผ๋, CharPrev()
ํจ์๋ ์ด๋ฅผ ์ค์ค๋ก ํ์ธํ๊ณ ์ ๋๋ก ์๋ํ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์์ ํจ์๋ ์ ๋๋ก๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฆฌํดํ ๊ฒ์
๋๋ค..
์ด์ , ์ฌ๋ฌ๋ถ์ ์์ 1๋ฒ ๊ท์น์ ๊นจ๊ฒ ๋ ๋ ์ผ์ด๋๋ ๋ถ์์ฉ๋ ์ฝ๊ฒ ์๊ฐํ์ค์ ์์ผ์ค ๊ฒ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ๋ถ์ด ์ ์ ๊ฐ ์ ๋ ฅํ ํ์ผ๊ฒฝ๋ก์์ ์บ๋ฆญํฐ ':' ๊ฐ ์ค๋ณต๋์ ๋ํ๋๋์ง ์๋์ง๋ฅผ ํ์ธํ๋ ๋ฃจํด์ ์ง ๋ค๊ณ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ๋ฃจํด์์ ๋ง์ฝ CharNext() API ํจ์ ๋์ ์ ++ ํฌ์ธํฐ ์ฐ์ฐ์ ์ฌ์ฉํ์ จ๋ค๋ฉด ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ๊ฒ์ ๋๋ค. ํนํ 2๋ฐ์ดํธ๋ฅผ ์ฐจ์งํ๋ ํ๊ธ ํ ๊ธ์์ Trail Byte๊ฐ ':' ์ ๊ฐ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ 100% ์๋ชป๋ ์ฐ์ฐ์ ํ๊ฒ ๋ ๊ฒ๋๋ค.
์์์ ๋งํ 2๋ฒ ๊ท์น์ ํ๋๋ฅผ ๋ํ์๋ฉด:
2a. ์ ๋๋ก ๋ฐฐ์ด ์ธ๋ฑ์ค์ ๋ง์ด๋์ค ์ฐ์ฐ์ ํ์ง ๋ง์.
์๋์ ์ฝ๋๋ 2๋ฒ ๊ท์น์ ์์ ๊ต์ฅํ ํก์ฌํฉ๋๋ค. ์๋ก, pLastChar
๊ฐ์ด ์ด๋ฐ์์ผ๋ก ํ ๋น๋์๋ค๋ฉด :
char* pLastChar = &szConfigFilename [strlen(szConfigFilename) - 1];
์ด ๋ฃจํด์ ๊ฒฐ๊ณผ๋ ์์ ์ค๋ช ๋๋ฆฐ --ํฌ์ธํฐ ์ฐ์ฐ์ ๋ถ์์ฉ์์ ๋๊ฐ์ ์ํฉ์ด ๋ฒ์ด์ง๋๋ค. ์๋ ์ฌ์ค ๋ฐฐ์ด ์ธ๋ฑ์ค์ ์ฐ์ฐ๋ ๋ด๋ถ์ ์ผ๋ก๋ ํฌ์ธํฐ ์ฐ์ฐ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ด์ฃ .. ํฅํฅ, ๊ฝค๋ ์ฅํฉํ๊ฒ ์ค๋ช ๋ ํํธ์ง๋ง ์ค์ง ๋ด์ฉ์ ๊ฐ๋จํ์ฃ ?
๋ค์ strxxx() ์ _mbsxxx() ํจ์๋ก ๋์๊ฐ์
์ด์ ๋ ์ _mbsxxx()
ํจ์์๋ฆฌ์ฆ๊ฐ ํ์ํ์ง ๋๋ผ์ค ๊ฒ๋๋ค. strxxx()
๊ณ์ด์ ํจ์๋ _mbsxxx()
ํจ์์๋ฆฌ์ฆ์๋ ๋ค๋ฅด๊ฒ DBCS์ ๋ํด ์ ํ ์์ง ๋ชปํฉ๋๋ค. ๋ง์ฝ strrchr("C:\\
๋๋ ํ ๋ฆฌ", '\\')
์ด๋ฐ์์ผ๋ก ํธ์ถ์ ํ์
จ๋ค๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ์๋ชป๋ ๊ฐ์ผ๊ฒ๋๋ค. ๋ฐ๋ฉด _mbsrchr()
ํจ์๋ ๋ง์ง๋ง์ 2๋ฐ์ดํธ ์บ๋ฆญํฐ๋ฅผ ์ ๋๋ก ์ธ์ํ๊ณ ์ ๋๋ก๋ ๋ฆฌํด๊ฐ์ ๋๊ฒจ์ค๊ฒ๋๋ค.
๋ง์ง๋ง์ผ๋ก ํ๊ฐ์ง ์ถ๊ฐํ์๋ฉด ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ฑฐ๋ ๋ฆฌํดํ๋ ํจ์๋ค์๋ ์ฃผ์ ํ์ค ํ์๊ฐ ์์ต๋๋ค. strlen("์คํธ๋ง") ์ ํจ์๋ 6์ ๋ฆฌํดํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ ๋์ฝ๋ ํจ์ wcslen(L"์คํธ๋ง") ์ด๊ฑด 3์ ๋ฆฌํดํ ๊ฒ๋๋ค. ์ฃผ์ํ๊ฒ์^^.
Win32 API์์์ MBCS ์ Unicode
๋ ์ข ๋ฅ์ API๋ค
์๋ง ๋์น ์ฑ์
จ์์ง๋ ๋ชจ๋ฅด๊ณ , ์๋์ง๋ ๋ชจ๋ฅด์ง๋ง, ๋ชจ๋ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ API๋ค์ ๋ ์ข
๋ฅ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ํ๊ฐ์ง ๋ฒ์ ผ์ MBCS๋ฅผ ๋ค๋ฃจ๊ณ ๋ค๋ฅธ ํ๋๋ ์ ๋์ฝ๋๋ฅผ ๋ค๋ฃน๋๋ค. ์๋ก, ์ค์ ๋ก๋ SetWindowText()
๋ผ๋ ํจ์๋ ์์ต๋๋ค. ๋์ SetWindowTextA()
์ SetWindowTextW()
๋ผ๋ ๋์ข
๋ฅ์ API๊ฐ ์ค์ ๋ก ์กด์ฌํ๋ ๊ฒ๋๋ค. ๋ง์ง๋ง์ A๋ (ANSI์ ์ฝ์ด์ฏค)์ MBCS๋ก ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ๋ปํ๊ณ , W๋ ์ ๋์ฝ๋ ๋ฒ์ ผ์ ๋ปํฉ๋๋ค.
์ฌ๋ฌ๋ถ์ด ํ๋ก๊ทธ๋จ์ ๋น๋ ํ์ค๋ ์ฌ๋ฌ๋ถ์ MBCS๋ ํน์ ์ ๋์ฝ๋๋๋ฅผ ์ ํํ์ค ์ ์์ต๋๋ค. ๋ง์ฝ VC์์ ์
ํ
์ ๊ฑด๋๋ฆฌ์ง ์์ผ์
จ๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก๋ MBCS๋ฐฉ์์ผ๋ก ๋น๋๋ ๊ฒ๋๋ค. ๊ทธ๋ผ ์ด๋ป๊ฒ ์ ์๋์ง๋ ์์ SetWindowText() ๋ผ๋ ํจ์๋ฅผ ์ธ์ ์๋๋ ๊ถ๊ธํ์๊ฒ ์ฃ ? winuser.h ํค๋ํ์ผ์ ์ดํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ผ๋ จ์ #define
๋ฌธ๋ค์ ๋ณด์ค ์ ์์ผ์ค ๊ฒ๋๋ค.:
BOOL WINAPI SetWindowTextA ( HWND hWnd, LPCSTR lpString ); BOOL WINAPI SetWindowTextW ( HWND hWnd, LPCWSTR lpString ); #ifdef UNICODE #define SetWindowText SetWindowTextW #else #define SetWindowText SetWindowTextA #endif
MBCS๋ก ๋น๋ ํ ๋์๋ UNICODE ๊ฐ ์ ์๋ ์์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ฒ๋ฆฌ๊ธฐ๋ ๋ค์์ผ๋ก ํด์ํ๊ฒ ๋ฉ๋๋ค.:
#define SetWindowText SetWindowTextA
๋ฐ๋ผ์ ์ ์ฒ๋ฆฌ๊ธฐ๋ ๋ชจ๋ SetWindowText()
๋ผ๋ ๋ฌธ์๋ฅผ SetWindowTextA()
๋ผ๊ณ ๋ฐ๊พธ๊ฒ ๋ฉ๋๋ค. ์ค์ ๋ก SetWindowText() ๋ผ๋ ๋งคํฌ๋ก๋ก ์ ์๋ ๋ค๋ฅธ์ด๋ฆ์ ํจ์๋์ SetWindowTextA ํน์ W ๋ก ๋๋๋ ํจ์๋ฅผ ์ฐ์ค์ ์์ต๋๋ค. ๋ฌผ๋ก ๊ทธ๋ด์ผ์ ๊ฑฐ์ ์๊ฒ ์ง๋ง์..
๊ทธ๋ผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ํจ์๋ก ์ธ๊ทธ๋ฆฌ ๋ฐ๊พธ๊ณ ์ถ์ผ์๋ค๋ฉด, VC์ค์ ์ preprocessor settings์์ _MBCS
๊ฐ์ list of predefined symbols์์ ์ ๊ฑฐํด ์ฃผ์๊ณ UNICODE
์ _UNICODE
๋ฅผ ๋ฃ์ด์ฃผ์๋ฉด ๋๋ฉ๋๋ค. ์ฃผ์ํ์ค ๊ฒ์ ๋๊ฐ์ ๊ฐ์ ๋ชจ๋ ์ ์ด์ฃผ์
์ผ ํฉ๋๋ค. ์ด๋คํด๋๋ UNICODE๋ผ๋ ๊ฒ๋ง ์ฌ์ฉํ๊ณ ์ด๋ค๊ฑด _UNICODE๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ ์ง๋ง, ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํ์ค๋ ์ฃผ์ ํ์ค๊ฒ ์์ต๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์ฃ :
HWND hwnd = GetSomeWindowHandle(); char szNewText[] = "we love Bob!"; SetWindowText ( hwnd, szNewText );
์ ์ฝ๋๋ ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ "SetWindowText"๋ฅผ "SetWindowTextW"๋ก ๋ฐ๊พผํ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.:
HWND hwnd = GetSomeWindowHandle(); char szNewText[] = "we love Bob!"; SetWindowTextW ( hwnd, szNewText );
๋ฌด์์ด ์๋ชป๋์๋์ง ์์๊ฒ ๋์? ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ ๋์ฝ๋๋ฅผ ์ทจํ๋ ํจ์์ SBCS ์ฆ 1๋ฐ์ดํธ ์ผ๋ฆญํฐ๋ฅผ ์ ๋ฌํ์ต๋๋ค. ์ฆ ์ ๋๋ก๋ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํ ์ ์๊ฒ ์ฃ ? ๊ทธ ์ฒซ๋ฒ์งธ ํด๊ฒฐ๋ฐฉ๋ฒ์ ๋ชจ๋ ์คํธ๋ง์ #define๋ฌธ์ผ๋ก ์๋์ ๊ฐ์ด ์ ์ ํ๋๊ฒ์ ๋๋ค.:
HWND hwnd = GetSomeWindowHandle(); #ifdef UNICODE wchar_t szNewText[] = L"we love Bob!"; #else char szNewText[] = "we love Bob!"; #endif SetWindowText ( hwnd, szNewText );
์๋ง ๋ชจ๋ ์คํธ๋ง์ ์ด๋ฐ์์ผ๋ก ์ ์ํ๋ค๊ฐ๋ ๋ฏธ์ณ ๋ฒ๋ฆด๊ฒ๋๋ค. ๋ค๋ฅธ ์ง์ข
์ ์์๋ณด์๊ฒ ์ฃ ? ์ฌ๊ธฐ์ ๋ํ ์ง์ ํ ํด๊ฒฐ์ฑ
์ TCHAR
์
๋๋ค.
๊ณ ๋ง๋ค TCHAR!
TCHAR
MBCS์์๊ฑด ์ ๋์ฝ๋์์๊ฑด ๋๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒํ๋ ์บ๋ฆญํฐ ํ์
์
๋๋ค. ๋ฐ๋ก ์์์ ๋ณธ #define
๋ฌธ๋ค์ ํด๊ฒฐ๋ฐฉ์์ ์ด๋ฏธ MS์์๋ ์ ์ํด TCHAR ๋ผ๋ ๋ฐฉ์์ผ๋ก ์ ์ํด ๋์์ต๋๋ค. ์๋์ ๊ฐ์ต๋๋ค.:
#ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif
๋ฐ๋ผ์ TCHAR
๋ MBCS๋ก ๋น๋ํ ๋๋ char
์ด๊ณ , ์ ๋์ฝ๋๋ก ๋น๋ํ ๋๋ wchar_t
ํ์
์ด ๋ฉ๋๋ค. ๋ํ ์ ๋์ฝ๋ ์คํธ๋ง์์ ์ถ๊ฐํด ์ฃผ๋ L์ด๋ผ๋ ๋ฌธ์๋ฅผ ์ํด _T()
๋ผ๋ ๋งํฌ๋ก๋ ์์ต๋๋ค.:
#ifdef UNICODE #define _T(x) L##x #else #define _T(x) x #endif
##
๋ ๋๊ฐ์ ๋ฌธ์์ด๋ค์ ํ๋์ ๋ฌธ์์ด๋ก ๋ง๋ค์ด ์ฃผ๋ ์ ์ฒ๋ฆฌ๊ธฐ ์ฐ์ฐ์ ์
๋๋ค. ์ฌ๋ฌ๋ถ์ ์ด ๊ธ์ ๋ณด๊ณ ๋๋ฉด ์ด์ ์คํธ๋ง์ ์ ์ธ ํ ๋๋ฉด ์ธ์ ๋ ์ง _T
๋งํฌ๋ก๋ฅผ ์ฌ์ฉํ์
์ผ ํฉ๋๋ค. ์ด ๋งํฌ๋ก๋ ์ ๋์ฝ๋ ๋ฌธ์์ด ์์๋ L๋ฌธ์๋ฅผ ์ถ๊ฐํด ์ค๋๋ค.
TCHAR szNewText[] = _T("we love Bob!");
SetWindowTextA
/W
๋ฅผ ํธํ๊ฒ ์๋ค๊ฐ๋ค ํ ์ ์๊ฒ ํด์ฃผ๋ ์ ์๋ค์ด ์๋๊ฒ ์ฒ๋ผ, strxxx()
๊ณผ _mbsxxx()
๋ฅ์ ์คํธ๋ง ์ฒ๋ฆฌ ํจ์๋ค ์ฌ์ด๋ฅผ ํธํ๊ฒ ๋ณ๊ฒฝ์ํฌ์ ์๋ ์ ์ ๋ค๋ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ _tcsrchr
๋งํฌ๋ก๋ฅผ strrchr()
์ด๋ _mbsrchr()
ํน์ wcsrchr()
๋ฅผ ์ฐ๋ ๋์ ์ฐ์ค์ ์์ต๋๋ค. _tcsrchr
ํจ์๋ SetWindowText
ํจ์๊ฐ ๊ทธ๋ฌํ๋ฏ MBCSํ๊ฒฝ์ด๋ ํน์ ์ ๋์ฝ๋ ํ๊ฒฝ์ด๋์ ๋ฐ๋ผ์ ์ ์ ํ ์นํ๋ ๊ฒ์
๋๋ค.
TCHAR
๋ฅผ ์ทจํ๋ ํจ์๋ ๋น๋จ strxxx()
๊ณ์ด์ ํจ์๋ง์ ์๋๋๋ค. ์๋ฅผ ๋ค๋ฉด _stprintf
(sprintf()
์ swprintf()
๋ฅผ ์นํ) ์ด๋ _tfopen
(fopen()
๊ณผ _wfopen()
๋ฅผ ์นํ)๊ณผ ๊ฐ์ ํจ์๋ค๋ ์์ต๋๋ค. ์ด์ ๊ด๋ จ๋ ํจ์๋ค์ ์ ์ฒด ๋ฆฌ์คํธ๋ MSDN์ "Generic-Text Routine Mappings" ๋ถ๋ถ์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
๋ฌธ์์ด ๊ทธ๋ฆฌ๊ณ TCHAR ํ์ ๋ค
ํ์
MBCSํ๊ฒฝ์์
์ ๋์ฝ๋ ํ๊ฒฝ์์
WCHAR
wchar_t
wchar_t
LPSTR
0์ผ๋ก ๋๋๋ charํ์ ๋ฌธ์์ด(char*
)
0์ผ๋ก ๋๋๋ charํ์ ๋ฌธ์์ด (char*
)
LPCSTR
0์ผ๋ก ๋๋๋ const charํ์ ๋ฌธ์์ด (const char*
)
0์ผ๋ก ๋๋๋ const charํ์ ๋ฌธ์์ด (const char*
)
LPWSTR
0์ผ๋ก ๋๋๋ ์ ๋์ฝ๋ํ์ ๋ฌธ์์ด (wchar_t*
)
0์ผ๋ก ๋๋๋ ์ ๋์ฝ๋ํ์ ๋ฌธ์์ด (wchar_t*
)
LPCWSTR
0์ผ๋ก ๋๋๋ const ์ ๋์ฝ๋ํ์ ๋ฌธ์์ด (const wchar_t*
)
0์ผ๋ก ๋๋๋ const ์ ๋์ฝ๋ํ์ ๋ฌธ์์ด (const wchar_t*
)
TCHAR
char
wchar_t
LPTSTR
0์ผ๋ก ๋๋๋ TCHARํ์ ๋ฌธ์์ด (TCHAR* -> char*
)
0์ผ๋ก ๋๋๋ TCHARํ์ ๋ฌธ์์ด (TCHAR*->wchar_t*
)
LPCTSTR
0์ผ๋ก ๋๋๋ const TCHARํ์ ๋ฌธ์์ด (const TCHAR*
)
0์ผ๋ก ๋๋๋ const TCHARํ์ ๋ฌธ์์ด (const TCHAR*
)
์ธ์ TCHAR ์ ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ
์ด์ ์ฌ๋ฌ๋ถ์ ์ ๋์ฝ๋ ์์ด๋ ์ ์ด์ ์๋๋ฐ ์ ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํ๋๊ฐ ์๋ฌธ์ด ๋ค ๊ฒ์ ๋๋ค. ์ ๋์ฝ๋ ๋ฐฉ์์ ์ฐ๋ฉด ๋์ด ๋ ๊ฒฝ์ฐ๋ ์ธ๊ฐ์ง๊ฐ ๋๊ฒ ์ต๋๋ค.:
- ํ๋ก๊ทธ๋จ์ด ์ค์ง Windows NT ํ๊ฒฝ์์๋ง ๋์๊ฐ๋ค.
- ํ๋ก๊ทธ๋จ์ด
MAX_PATH
๋ณด๋ค ๊ธด ํ์ผ๋ช ์ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ค. - ํ๋ก๊ทธ๋จ์ด Window XP๋ฑ์์ ์๊ฐ๋ ์ค์ง ์ ๋์ฝ๋๋ง ๋ฐ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
๋๋ถ๋ถ์ ์ ๋์ฝ๋ํจ์๋ Windows 9x์๋ฆฌ์ฆ์๋ ๊ตฌํ๋ ์์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด 9x์๋ฆฌ์ฆ์์๋ ๋์๊ฐ์ผ ํ๋ค๋ฉด ์ ๋์ฝ๋๋ ์ข์ ์ ํ์ด ์๋๊ฒ๋๋ค. (Microsoft Layer for Unicode ๋ผ๋ 9x์์๋ ์ ๋์ฝ๋๋ฅผ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ธด ํฉ๋๋ค.) ๊ทธ๋ ์ง๋ง, NT๋ ๋ด๋ถ์ ์ผ๋ก๋ ๋ชจ๋ ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ๋์ฝ๋ API๊ฐ ์๋ง ์ฝ๊ฐ์ ์ฑ๋ฅํฅ์์ ๋์์ด ๋ ๊ฒ์ ๋๋ค. MBCS๋ฐฉ์์ ์คํธ๋ง์ NTํ๊ฒฝ์์ ์ฌ์ฉํ๋ฉด ์ด์์ฒด์ ๋ ๋ด๋ถ์ ์ผ๋ก ๊ทธ ์คํธ๋ง์ ์ ๋์ฝ๋๋ก ๋ณํํ ๋ค์ ๊ทธ์ ์์ํ๋ ์ ๋์ฝ๋ ํจ์๋ฅผ ํธ์ถํ ๊ฒ์ ๋๋ค. ๊ฒฐ๊ณผ๊ฐ ๋ฆฌํด๋๋ฉด ๋ค์ MBCS๋ฐฉ์์ผ๋ก ์ ํํ ๋ค์ ๋ฆฌํดํด ์ค๊ฒ์ ๋๋ค. ์ด ์ ์ฐจ๋ ์๋นํ ์ต์ ํ ๋์๊ฒ ์ง๋ง, ์๋ง ์ ๋์ฝ๋๋ฅผ ์ง์ ์ธ๋๋ณด๋ค๋ ์ฑ๋ฅ์ ์์ฃผ ์ฝ๊ฐ์ผ์ง๋ ๋ชจ๋ฅด์ง๋ง ๊ฐ์๋ ํผํ ์ ์์ ๊ฒ๋๋ค.
NT๋ ๋ํ ์์ฃผ ๊ธด ํ์ผ๋ช
์ ์ง์ํฉ๋๋ค. (MAX_PATH
๋ณด๋ค ๊ธด ํ์ผ๋ช
) ๊ทธ๋ฌ๋ ์ ๋์ฝ๋๊ฐ ์ฐ์ผ ๋๋ง ์
๋๋ค. ํ์ง๋ง ๋ฌด์๋ณด๋ค๋ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋ชจ๋ ์ธ์ด ์๋ฅผ ๋ค๋ฉด ์ค๊ตญ์ด, ์์ด , ์ผ์ด, ํ๊ตญ์ด ๋ฅผ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด ์ค์ ์๋ค๋ ๊ฒ์ผ ๊ฒ๋๋ค.
๋ง์ง๋ง์ผ๋ก, Windows 9x ์๋ฆฌ์ฆ๋ฅผ ๋ง์ง๋ง์ผ๋ก MS๋ MBCS API๋ฐฉ์์ ๋ฉ๋ฆฌํ๊ณ ์ ๋์ฝ๋ ๋ฐฉ์์ผ๋ก ์ ํฅํ๊ณ ์์ต๋๋ค. ์๋ฅผ๋ค๋ฉด, SetWindowTheme()
์ด๋ผ๋ API ํจ์๋ ์ค์ง ์ ๋์ฝ๋ ์คํธ๋ง ๋ง์ ๋ฐ์ต๋๋ค. ์์ํ๋ MBCS๋ฒ์ ผ์ด ์์ต๋๋ค. ์ ๋์ฝ๋๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด์ ์ ๋์ฝ๋์ MBCS์ฌ์ด์ ์๋ค๊ฐ๋ค ํด์ผํ๋ ๊ท์ฐฎ์์ ์ป์ ์ค๊ฒ๋๋ค.^^
๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋น์ฅ ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ์ค ์ง๋ผ๊ณ , ์ฌ๋ฌ๋ถ์ ๋ฐ๋์ TCHAR
์ ๊ทธ์ ๊ด๋ จ๋ ํจ์๋ค์ ์จ์ฃผ์
์ผ ๋ฏธ๋๋ฅผ ์ํด ์ข์ผ์ค ๊ฒ๋๋ค. DBCS๋ฅผ ๋ณด๋ค ์์ ํ๊ฒ ์ฌ์ฉํ๋๊ฒ ๋ชป์ง์๊ฒ ๋์ค์ ์ ๋์ฝ๋๋ก ํ๋ก๊ทธ๋จ์ ๋ฐ๊พธ์ค๋ ๋จ์ง ์
ํ
ํ๋ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ง์ฌ ์ค์ผ์ด ์ด๊ธฐ ๋๋ฌธ์ด์ฃ ^^