์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•


์›๋ฌธ :

๏ปฟ๊ฐœ๋ฐœ์ž์˜ 10๋…„์ผ๊ธฐ

http://devdev.tistory.com/74

๋ฌธ์ž์„ธํŠธ ๋ฐ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ๊ธฐ๋ณธ ๊ทธ๋ฆฌ๊ณ  ์œˆ๋„์šฐ32์—์„œ๋Š” ์–ด๋–ค ์‹์œผ๋กœ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ์ด ๊ธ€์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตญ์ œํ™”์— ๋Œ€ํ•œ ๊ด€์‹ฌ๋„๋ฅผ ๋†’์ด๊ณ  ๊ตญ์ œํ™”์˜ ์‹คํ˜„์— ๋Œ€ํ•œ ์ „์ฒด์ ์ธ ์•ˆ๋ชฉ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

๋ฌธ์ž ์„ธํŠธ

๋ฌธ์ž์„ธํŠธ๋ž€ ํ•˜๋‚˜์˜ ๋ฌธ์ž์™€ ๊ทธ ๋ฌธ์ž์— ๋ถ€์—ฌ๋œ ๊ฐ’์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ผ์ข…์˜ ํ…Œ์ด๋ธ”๊ณผ๋„ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค. ์ปดํ“จํ„ฐ ๋ถ„์•ผ์—์„œ์‚ฌ์šฉ๋˜๊ณ ์žˆ๋Š” ๋ฌธ์ž์„ธํŠธ๋ฅผ ํฌ๊ฒŒ ๋ณธ๋‹ค๋ฉด SBCS(Single Byte Character Set), MBCS(Multi ByteCharacter Set), DBCS(double Byte Character Set), WBCS(Wide ByteCharacter Set ๋˜๋Š” Unicode) ๋“ฑ ๋„ค ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

SBCS๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž์„ธํŠธ์— ๋ถ€์—ฌ๋œ ๊ธ€์ž ๊ฐ’์ด Single Byte, ์ฆ‰ 0-255์˜ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์Œ์„ ๋งํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜์•Œ๊ณ ์žˆ๋Š” ASCII ๋˜๋Š” ISO-8859-1 ๋ฌธ์ž ์„ธํŠธ๊ฐ€ ์—ฌ๊ธฐ์— ์†ํ•œ๋‹ค. ์ฃผ๋กœ 0x00๋ถ€ํ„ฐ 0x7F๊นŒ์ง€๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•Œ๊ณ ์žˆ๋Š”ASCII๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ด ์ค‘์—์„œ๋„ 0x20๋ถ€ํ„ฐ 0x7F๊นŒ์ง€๋Š” ํ™”๋ฉด ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์„ธํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. SBCS๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ ์–ธ์–ด๋“ค์€ 0x80๋ถ€ํ„ฐ 0xFE๊นŒ์ง€์˜ ๋ฌธ์ž์„ธํŠธ๋ฅผ ์ œ๊ฐ๊ธฐ ๋”ฐ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ด๋“ค ๊ฐ ๋ฌธ์ž์„ธํŠธ๋“ค์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ์ฝ”๋“œํŽ˜์ด์ง€(Codepage)๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

DBCS๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž์„ธํŠธ์— ๋ถ€์—ฌ๋œ ๊ธ€์ž๊ฐ’์ด ๋‘ ๋ฐ”์ดํŠธ, ์ฆ‰ 0-65535์˜ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์Œ์„ ๋งํ•œ๋‹ค. ์ด๋Š” ์›๋ž˜์˜8๋น„ํŠธ์—์„œ ๋˜ ๋‹ค๋ฅธ 8๋น„ํŠธ๋ฅผ ๋‹จ์ˆœํžˆ ํ™•์žฅํ•œ ๊ฒƒ์ด๋‹ค. DBCS๋Š” 8๋น„ํŠธ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋ฌธ์ž์˜ ์ข…๋ฅ˜๊ฐ€ ๋งŽ์€ ์ค‘๊ตญ, ํ•œ๊ตญ,์ผ๋ณธ ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋งŒ ๋“ฑ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. DBCS๋Š” SBCS์˜ ํ•œ๊ณ„๋ฅผ ๋„“ํžˆ๋Š” ๋ชฉ์ ์€ ์ด๋ฃจ์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์œผ๋‚˜ ํ”„๋กœ๊ทธ๋žจ์ƒ์˜๋งŽ์€ ๋ถˆํŽธํ•œ ์ ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ๋Š” ์ผ์ข…์˜ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์•ˆ๊ณ  ์˜จ ์…ˆ์ด๊ธฐ๋„ ํ•˜๋‹ค(์—ฌ๊ธฐ์„œ ํ•„์ž๊ฐ€ ๋งํ•˜๋Š” ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ž€DBCS ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๊ฒƒ์€ ๊ฒฐ์ฝ” ์•„๋‹ˆ๋ฉฐ, DBCS๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ๋„ ์›๋ž˜์˜ SBCS๋ฅผ ๊ณ„์† ์ง€์›ํ•ด์•ผ๋งŒ ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์˜ค๋Š”ํ”„๋กœ๊ทธ๋žจ์ƒ์˜ ๋ณต์žก์„ฑ์—์„œ ์˜ค๋Š” ๋ถˆํŽธํ•จ์„ ์˜๋ฏธํ•œ๋‹ค).

MBCS๋ž€ SBCS์™€ DBCS๋ฅผ ํ•œ๋ฐ ๋ฌถ์–ด๋†“์€ ๋ฌธ์ž์„ธํŠธ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, DBCS์˜ ๋ฌธ์ž์„ธํŠธ์—๋Š” ๊ฑฐ์˜ SBCS์˜ ๋ฌธ์ž๊ฐ€ํฌํ•จ๋˜๋ฏ€๋กœ, ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” DBCS๋Š” ์‚ฌ์‹ค์€ ์ฃผ๋กœ MBCS๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํ•œ๊ธ€์˜ KSC5601์„ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, ๋ฌธ์ž์„ธํŠธ์˜ ์ฒ˜์Œ๋ถ€๋ถ„์ธ 0x00๋ถ€ํ„ฐ 0x7E ๊นŒ์ง€๋Š” ASCII์™€ ๋™์ผํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฐ์—ด์€ ์ค‘๊ตญ, ์ผ๋ณธ, ๋Œ€๋งŒ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ฉฐ ๋‚˜์ค‘์—์„ค๋ช…ํ•  Unicode์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. DBCS์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋ฅผ ๋ฆฌ๋”ฉ ๋ฐ”์ดํŠธ(Leading Byte)๋ผ ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋ฐ”์ดํŠธ๋ฅผ ํŠธ๋ž˜์ผ๋ง ๋ฐ”์ดํŠธ(Trailing Byte)๋ผ ํ•˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ 128 ๋ฌธ์ž๋Š” ASCII๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ ๋‚˜์ค‘ 128 ๋ฌธ์ž๋Š”๊ฐ ์–ธ์–ด๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ง€์ •๋˜์–ด์žˆ๋‹ค. ์ผ๋ณธ ์ฝ”๋“œํŽ˜์ด์ง€ 932, ์ค‘๊ตญ 936, ํ•œ๊ตญ 949 ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋งŒ ์ชฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œํŽ˜์ด์ง€950 ๋“ฑ์ด DBCS์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ASCII๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฐ DBCS๋“ค์ด ๋ชจ๋‘ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆํ”„๋กœ๊ทธ๋žจ์—์„œ strlen()๋Š” MBCS์—์„œ๋Š” ๋” ์ด์ƒ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๊ฒŒ๋œ๋‹ค. ์ฆ‰, strlen()์€ ๋ฌธ์ž์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ๋˜๋Š”๋ฐ, SBCS์—์„œ๋Š” ๋ฌธ์ž์˜ ์ˆ˜๊ฐ€ ๋ฐ”์ดํŠธ ์ˆ˜์™€ ์ผ์น˜ํ•˜๋ฏ€๋กœ strlen()์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ์‚ฌ์‹ค ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋ฐ”์ดํŠธ์˜ ์ˆซ์ž์ผ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ MBCS์—์„œ๋Š” ๋ฌธ์ž์˜ ์ˆ˜์™€ ๊ทธ ๋ฌธ์ž๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋ฐ”์ดํŠธ์˜ ์ˆ˜๋Š” ๊ทธ ๊ฐ’์ด ๋‹ค๋ฅด๋ฏ€๋กœ strlen()์œผ๋กœ ๋ฌธ์ž์˜์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค.

์ด์™€ ๊ฐ™์ด MBCS ์‚ฌ์šฉ์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์ด๋ผ๋ฉด I/O์— ์—ฐ๊ด€๋œ ๋ฌธ์ž์˜ ์ฒ˜๋ฆฌ์— ํ•ด๋‹น๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ๋กœ์ง์„์ผ์ผ์ด DBCS์™€ SBCS์„ ์—ผ๋‘์— ๋‘๊ณ  ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ SBCS์™€ DBCS๋ฅผ ๋™์‹œ์— ์—ผ๋‘์— ๋‘๊ณ ์ž…์ถœ๋ ฅ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์žˆ์–ด์„œ๋Š” ๊ท€์ฐฎ์€ ์ผ์ด๋ฉฐ ์ž์นซ ์‹ค์ˆ˜ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ƒ์˜ BUG(๋ฒ„๊ทธ ๋˜๋Š” ์˜ค๋ฅ˜)๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”์š”์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค. SBCS๋กœ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ตญ์ œํ™”(Internationalization ํ˜น์€ ๊ฐ„๋‹จํ•˜๊ฒŒ i18n)ํ•  ์ˆ˜ ์—†๊ณ MBCS๋ฅผ ์‚ฌ์šฉํ•˜์ž๋‹ˆ ํ”„๋กœ๊ทธ๋žจ์ƒ์˜ ๋‚œ์ด๋„๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ ๊ฐ ์–ธ์–ด๋งˆ๋‹ค ์ œ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฌธ์ž์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋‹ˆ ํ”„๋กœ๊ทธ๋žจ๊ตญ์ œํ™”์˜ ๊ธธ์€ ์ ์  ๋ฉ€์–ด์ง€๊ฒŒ๋˜๋Š” ๋Š๋‚Œ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐœ๋ฐœ๋œ ๊ฒƒ์ด ๋ฐ”๋กœ ์œ ๋‹ˆ์ฝ”๋“œ์ด๋‹ค.


์œ ๋‹ˆ์ฝ”๋“œ

์œ ๋‹ˆ์ฝ”๋“œ๋Š” ํ”ํžˆ WBCS๋ผ ๋งํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด SBCS์™€ DBCS๊ฐ€ ๊ณต์กดํ•˜๋Š” MBCS์™€๋Š” ๋‹ฌ๋ฆฌ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ’์ด์ผ๊ด„์ ์œผ๋กœ 16๋น„ํŠธ๋กœ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ์ž˜ ์‚ดํŽด๋ณด๋ฉด ๊ธฐ์กด์˜ ๊ตญ์ œ ํ‘œ์ค€ํ™”์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์ตœ๋Œ€ํ•œ ์ง€ํ‚ค๋ ค์• ์ผ์Œ์„ ํ•œ ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ๋„ DBCS์—์„œ์ฒ˜๋Ÿผ ๋ฌธ์ž๊ฐ’์˜ ํ‘œํ˜„์— ์žˆ์–ด์„œ 16๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ 0-65535 ๋ฒ”์œ„์˜๊ฐ’์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์ด ๊ฐ’์œผ๋กœ ์ง€๊ตฌ์ƒ์˜ ๋ชจ๋“  ์–ธ์–ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์—” ์ถฉ๋ถ„ํ•œ ์…ˆ์ด๋‹ค.

๊ทธ๋ฆผ 1์—์„œ ๋ณด๋Š” ๋ฐ”์™€ ๊ฐ™์ด, ์ฒ˜์Œ 127 ๋ฌธ์ž์ธ 0x0000๋ถ€ํ„ฐ 0x00 7F๋Š” ASCII์˜ 0x00๋ถ€ํ„ฐ 0x7F์˜๋ฌธ์ž์™€ ๋™์ผํ•˜๋ฉฐ, 0x0080๋ถ€ํ„ฐ 0x00FE๋Š” ๊ตญ์ œํ‘œ์ค€ํ™” ISO8859-1์˜ ์ˆœ์„œ์™€ ๋™์ผํ•˜๊ฒŒ ๋ฐฐ์—ดํ•˜์˜€๋‹ค. ์ด๋กœ์จ ์œ ๋‹ˆ์ฝ”๋“œ์™€SBCS์˜ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๋ฌธ์ž์„ธํŠธ์™€์˜ ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํ•˜์˜€๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ๋Š” ๋˜ํ•œ ํ•œ๊ธ€์˜ ์กฐํ•ฉํ˜•๊ณผ ์ฝ”๋“œ ๊ฐ’๋งŒ ๋‹ค๋ฅผ ๋ฟ ๊ทธ ๋ฐฐ์—ด์€๋™์ผํ•˜๋ฉฐ, ๋”ฐ๋ผ์„œ Unicode์™€ ์กฐํ•ฉํ˜• ์ฝ”๋“œ์™€์˜ ๋ณ€ํ™˜์ด ๋งค์šฐ ์šฉ์ดํ•˜๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ์—์„œ ์ •์˜ํ•œ ํ•œ๊ธ€ ์กฐํ•ฉํ˜•์€ ๊ทธ๋ฆผ 1์—์„œ ๋ณด๋“ฏ์ดAC00๋ถ€ํ„ฐ D7A3, ์ฆ‰ 11172๊ฐœ์ด๋‹ค. ๊ทธ๋ฆผ 1์—์„œ ์ฒ˜์Œ 256๊ฐœ์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์€ ISO/ANSI 8859-1์™€ ๊ทธ ๋ฌธ์ž๋ฐฐ์—ด์ด ๋™์ผํ•˜๋ฉฐ (ISO/ANSI 8859-1์˜ ์ฒ˜์Œ 127๊ฐœ์˜ ๊ธ€์ž ๊ฐ’์€ ASCII 7๋น„ํŠธ์™€ ๋™์ผํ•˜๋‹ค.), ์ค‘๋ณต๋˜๋Š” ์—ฌ๋Ÿฌ๊ธฐํ˜ธ๋“ค ๊ทธ๋ฆฌ๊ณ  ํ•œ๊ตญ, ์ผ๋ณธ ๋ฐ ์ค‘๊ตญ, ๋Œ€๋งŒ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•œ์ž ํ‘œ๊ธฐ๋Š” ๊ทธ ๋ชจ์–‘์ด ๋™์ผํ•˜๋ฉด ๋ชจ๋‘ ํ•˜๋‚˜์˜ ์ฝ”๋“œ๊ฐ’์œผ๋กœ ๋ฌถ์–ด๋†“์•˜๋‹ค.


ยทGeneral Scripts : ์ฃผ๋กœ SBCS์ธ Latin, Cyrillic, Greek, Hebrew, Arabic, Devanagari, Thai ๋“ฑ์˜ ๋ฌธ์ž์„ธํŠธ๋“ค์„ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

ยทSymbols : ๊ตฌ๋‘์ , ํ•™์ˆ ๊ธฐํ˜ธ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ข… ์‹ฌ๋ฒŒ๋“ค์„ ์ •์˜ํ•œ๋‹ค.

ยทCJK Misc.: CJK(Chinese, Japanese, Korean)์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ข…   ์Œ์„ฑ๊ธฐํ˜ธ

ยทCJK Ideographs : ํ•œ์ž ํ‘œ๊ธฐ(20902)

ยทHangul : ํ•œ๊ธ€ ํ‘œ๊ธฐ(11172)

ยทSurrogate: Future Expansion(2048)

ยทPrivate Usage : ํŠน์ • ๋ฒค๋” ๋˜๋Š” ์‚ฌ์šฉ์ž ์‚ฌ์šฉ(6400)

ยทCompatibility : ์œ ๋‹ˆ์ฝ”๋“œ์™€ ๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ ์‹œ์Šคํ…œ๊ณผ์˜ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์— ๋Œ€๋น„ํ•˜์—ฌ ์ค€๋น„ํ•œ ๋ฒ”์œ„


ํ•œ๊ธ€ ์ดˆ์„ฑ์ด 19๊ฐœ, ์ค‘์„ฑ์ด 21๊ฐœ, ๊ทธ๋ฆฌ๊ณ  ์ข…์„ฑ์ด 27๊ฐœ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ข…์„ฑ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์‹ค์ƒ ์ข…์„ฑ์€28๊ฐœ๊ฐ€ ๋˜๋Š” ์…ˆ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์กฐํ•ฉํ˜• ํ•œ๊ธ€์ด ์ง€์›ํ•˜๋Š” ์ด ๊ธ€์ž ์ˆ˜๋Š” 19ร—21ร—28 = 11,172๋กœ์„œ ์œ ๋‹ˆ์ฝ”๋“œ์—์„œ ์ง€์›ํ•˜๋Š”๊ธ€์ž ์ˆ˜์™€ ์ผ์น˜ํ•œ๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ์—์„œ๋Š” ์™„์„ฑ๋œ ํ•œ๊ธ€ ๊ธ€์ž ์™ธ์—๋„ ํ•œ๊ธ€ ์ดˆ์„ฑ, ์ค‘์„ฑ, ์ข…์„ฑ์„ ๋”ฐ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋“ค ์ž๋ชจ๊ฐ’์˜์ฒด๊ณ„์ ์ธ ๋ฐฐ์น˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ๋‚ด์˜ ์™„์„ฑ๋œ ํ•œ๊ธ€๋กœ์˜ ๋ณ€ํ™˜์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ ์žˆ๋‹ค. ํ‘œ 1์˜ ์ž๋ชจํŒ์„ ๋ณด๋ฉด์„œ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ๊ธ€์ž๊ฐ’์„ ํ•จ๊ป˜๊ณ„์‚ฐํ•ด ๋ณด๋„๋ก ํ•˜์ž.

์œ ๋‹ˆ์ฝ”๋“œ์— ์ •์˜๋œ ์ž๋ชจ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์™„์„ฑ๋œ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ๊ธ€์ž๊ฐ’๊ณผ ์กฐํ•ฉํ˜• ๊ธ€์ž๊ฐ’์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฒˆํ˜ธ๋Š” ๊ฐ ์ž๋ชจ์—ํ• ๋‹น๋œ ์ธ๋ฑ์Šค๊ฐ’์ด๋ฉฐ ๋‘ ๋ฒˆ์งธ ๋ฒˆํ˜ธ๋Š” ํ•ด๋‹น ์ž๋ชจ์˜ ์œ ๋‹ˆ์ฝ”๋“œ๊ฐ’์ด๋‹ค. ์กฐํ•ฉํ˜• ๋ฌธ์ž์„ธํŠธ๋กœ์˜ ์ฝ”๋“œ๊ฐ’ ๋ณ€ํ™˜์€ ์ดˆ์„ฑ, ์ค‘์„ฑ, ์ข…์„ฑ์— ๊ฐ๊ฐ์ฑ„์›€์ด ์žˆ์œผ๋ฏ€๋กœ ์œ„์˜ ์ธ๋ฑ์Šค๋ฅผ ์กฐ๊ธˆ์”ฉ ๋ณ€๊ฒฝํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

์ž๋ชจ๊ฐ’์„ ํฌํ•จํ•œ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ง์„ ๋ฐ›์•„ ํ•œ๊ธ€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฒ„์ „ 2์—์„œ ์ œ์‹œํ•˜๊ณ ์žˆ๋‹ค. ์ดˆ์„ฑ, ์ค‘์„ฑ, ์ข…์„ฑ์˜ ๊ฐ์ธ๋ฑ์Šค๊ฐ’์„ ๊ฐ๊ฐ Cho_i, Jung_i, Jong_i๋กœ ์ •์˜ํ•œ๋‹ค๋ฉด ์œ ๋‹ˆ์ฝ”๋“œ ๊ธ€์ž๊ฐ’(V)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.


V = { [(Cho_i ร— 21) + Jung_i] ร— 28 } + Jong_i + 0xAC00


์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ๋‹ˆ์ฝ”๋“œ ์ž…๋ ฅ ์ŠคํŠธ๋ง์˜ ๊ฐ’์ด 0x1111(์ดˆ์„ฑ), 0x1171(์ค‘์„ฑ), 0x11B6(์ข…์„ฑ)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋ฉด์œ„์˜ ์ž๋ชจ๊ฐ’์— ์˜ํ•˜๋ฉด 0x1111=ใ…, 0x1171=ใ…Ÿ, 0x11B6=ใ…€์ด ๋˜๋ฏ€๋กœ ์™„์„ฑ๋œ ๊ธ€์ž๋Š” โ€˜โ€™ ์ด ๋˜์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์— ์ฃผ์–ด์ง„ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜์ž.

0x1111์€ ์ดˆ์„ฑ์œผ๋กœ ์œ„ ํ…Œ์ด๋ธ” 1์— ์˜ํ•œ ์ธ๋ฑ์Šค ๊ฐ’์€ 17 (0๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•จ), 0x1171์€ 16, ๊ทธ๋ฆฌ๊ณ 0x11B6์€ 14๊ฐ€ ๋˜๋ฏ€๋กœ Cho_i=17, Jung_i=16, Jong_i=14๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฐ’์— ํ•ด๋‹น๋˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ์˜ํ•œ๊ธ€๊ฐ’ V = ( [ (17 ร— 21)+16 ] ร— 28 ) + (14 + 1) + 0xAC00 = D4DB ()์ด ๋œ๋‹ค.ํ•œ๊ธ€์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฐฐ์—ด์ด 0xAC00์—์„œ ์‹œ์ž‘๋˜๋ฏ€๋กœ ํ•œ๊ธ€์˜ ์ฒซ ๊ธ€์ž โ€˜๊ฐ€โ€™์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์ด ๋ฐ”๋กœ 0xAC 00์ด ๋œ๋‹ค. ์—ญ์‹œ ์œ„์˜๊ณต์‹์— ์˜ํ•˜๋ฉด {((0 ร— 21)+0) ร— 28 + 0 + 0xAC00} = 0xAC00์ด ๋œ๋‹ค.

์ด ๊ณต์‹์„ ํ”„๋กœ๊ทธ๋žจ์— ์ ์šฉํ•œ๋‹ค๋ฉด ๊ฒฐ๊ตญ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ๋กœ์ง์ด ๋  ๊ฒƒ์ด๋‹ค.


void IndexToUnicode (unsigned short Cho_i, Jung_i, Jong_i)

{

   unicodeValue = ((Cho_i * 21 + Jung_i)) * 28;

   if(Jong_i)

   {

    unicodeValue += Jong_i + 1;

   }

   unicodeValue += 0xAC00;

}


ํ•œ๊ฐ€์ง€ ์œ ์˜ํ•  ์ ์ด ์žˆ๋‹ค๋ฉด ์—ญ์‹œ ์ข…์„ฑ์˜ ์ธ๋ฑ์Šค ๊ฐ’(Jong_i) ๊ณ„์‚ฐ์ธ๋ฐ, ์ข…์„ฑ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ํ…Œ์ด๋ธ” 1์— ํ‘œ๊ธฐ๋œ์ธ๋ฑ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ข…์„ฑ์ด ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ๋Š” Jong_i + 1์„ ์ข…์„ฑ์˜ ์ธ๋ฑ์Šค ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค(์œ ๋‹ˆ์ฝ”๋“œ์— ์‚ฌ์šฉ๋œ ์ž๋ชจ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ๋ฆฝ๋œ ํ•œ๊ธ€์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค). ํ…Œ์ด๋ธ” 1์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์กฐํ•ฉํ˜• ๋ฌธ์ž ์„ธํŠธ์—์„œ์˜ ๊ฐ’์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.


void toJohab(unsigned short Cho_i, Jung_i, Jong_i)

{

   Cho_i += 2;

   Jung_i += 3;

   if(Jung_i >= 25) Jung+=2;

     /* ์ค‘์„ฑ ์ธ๋ฑ์Šค 24, 25๋Š” ์œ ๋‹ˆ์ฝ”๋“œ์— ์ •์˜๋˜์ง€ ์•Š์•˜์Œ */

   if(Jung_i >= 18) Jung+=2;

     /* ์ค‘์„ฑ ์ธ๋ฑ์Šค 16, 17์€ ์œ ๋‹ˆ์ฝ”๋“œ์— ์ •์˜๋˜์ง€ ์•Š์•˜์Œ */

   if(Jung_i >= 9)  Jung+=2;

     /* ์ค‘์„ฑ ์ธ๋ฑ์Šค 8, 9๋Š” ์œ ๋‹ˆ์ฝ”๋“œ์— ์ •์˜๋˜์ง€ ์•Š์•˜์Œ */

   Jong_i += 2;

       

   johabValue = (1 << 15)|(Cho_i << 10)|(Jung_i << 5)|Jong_i;

}


์•ž์„œ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ์˜ˆ๋ฅผ ๋“ค๋ฉด์„œ ์‚ฌ์šฉํ•œ โ€˜โ€™ ์˜ ์กฐํ•ฉํ˜• ๋ฌธ์ž๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.


V = (1 << 15) | (19 << 10) | (23 << 5) | 16


๋”ฐ๋ผ์„œ โ€˜โ€™ ์— ํ• ๋‹น๋œ ์กฐํ•ฉํ˜• ๋ฌธ์ž๊ฐ’์„ ๋น„ํŠธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋ฉด โ€˜1100 1110 1111 0000โ€™์ด ๋˜๋ฏ€๋กœ 0xCDF0์ด ๋œ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๋‚˜๋ผ์˜ ๋ฌธ์ž์„ธํŠธ๋“ค, ์œ ๋‹ˆ์ฝ”๋“œ, ์œ ๋‹ˆ์ฝ”๋“œ์™€ ASCII์˜ ๊ด€๊ณ„ ๊ทธ๋ฆฌ๊ณ  ์œ ๋‹ˆ์ฝ”๋“œ์™€ ํ•œ๊ธ€ ์กฐํ•ฉํ˜• ๋ฌธ์ž์„ธํŠธ์™€์˜๊ด€๊ณ„๋“ค์„ ์•Œ์•„๋ณด์•˜๋‹ค. ํ˜น ์–ด๋–ค ๋…์ž๋“ค์€ ์ง€๊ธˆ๊นŒ์ง€์˜ ์„ค๋ช…๋“ค์ด ์•„์ง ์ž˜ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์œผ๋ฆฌ๋ผ ์ƒ๊ฐํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ ๋„ˆ๋ฌด ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ์˜ ์ดํ•ด๊ฐ€ ์•„์ง์€ ์œˆ๋„์šฐ I/O ์•„ํ‚คํ…์ฒ˜์—์˜ ์ดํ•ด์— ์žˆ์–ด์„œ ํ•„์ˆ˜๋ผ๊ณ ๋Š” ๋งํ•  ์ˆ˜๋Š” ์—†๊ธฐ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ํ•„์š”๋ฅผ ์‹ค๊ฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตญ์ œํ™”์˜ ์ธก๋ฉด์— ์žˆ์–ด์„œ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๊ฐ€ ๊ฐ€๊นŒ์šด๋ฏธ๋ž˜์— ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ํŠนํžˆ ์œˆ๋„์šฐ NT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋…์ž๋ผ๋ฉด ์œ ๋‹ˆ์ฝ”๋“œ์˜ ์ดํ•ด๋Š” ๊ฑฐ์˜ ํ•„์ˆ˜๋ผ ๋งํ•˜๊ณ  ์‹ถ๋‹ค.


Unicode์™€ ์œˆ๋„์šฐ

์œ„์—์„œ ์šฐ๋ฆฌ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ตญ์ œํ™”๋ฅผ ์œ„ํ•ด์„œ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๊ฐ€ ์™œ ๋ฐ”๋žŒ์งํ•œ ํ•ด๊ฒฐ์ฑ…์ธ๊ฐ€๋ฅผ ์•Œ์•„๋ณด์•˜๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ ์ค‘์‹ฌ์˜ ์†Œํ”„ํŠธ์›จ์–ด๊ตญ์ œํ™”๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ๊ฐœ๋ฐœ๋œ OS๊ฐ€ ๋ฐ”๋กœ ์œˆ๋„์šฐ NT๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์œˆ๋„์šฐ 95 ๋˜๋Š” ์œˆ๋„์šฐ 98๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์›๋ž˜๋ถ€ํ„ฐ์œ ๋‹ˆ์ฝ”๋“œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ตœ์ ํ™”๋˜์–ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ ๋”ฐ๋ผ์„œ ์ง€์—ญํ™”๋ฅผ ๋”์šฑ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ฌธ์ž๋“ค์„ ๋ณด๋‹ค ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ๋งŽ์€ ์—…์ฒด์—์„œ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ตญ์ œํ™”๋ฅผ ์ด๋ฃจ๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์œผ๋กœ ์ „ํ†ต์ ์ธ ๋ฌธ์ž์„ธํŠธ์™€ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์•„์ง์€ ์œ ๋‹ˆ์ฝ”๋“œ๊ฐ€์™„์ „ํ•œ ๋ฟŒ๋ฆฌ๋ฅผ ๋‚ด๋ฆฌ์ง€ ๋ชปํ•œ ์ƒํ™ฉ์ด๋ฏ€๋กœ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋Š” ์ „ํ†ต์ ์ธ ๋ฌธ์ž์„ธํŠธ์™€ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๋™์‹œ์— ์ง€์›ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์žฌ๋กœ์„œ๋Š”์†Œํ”„ํŠธ์›จ์–ด ๊ตญ์ œํ™”์˜ ๋ฐ”๋žŒ์งํ•œ ์ ‘๊ทผ๋ฐฉ๋ฒ•์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‘ ๋ฌธ์ž์ฒด๊ณ„๋ฅผ ๋™์‹œ์— ์ง€์›ํ•˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๊ธธ์„ ์„ ํƒํ•  ์ˆ˜์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ž…์ถœ๋ ฅ๋˜๋Š” ๋ฌธ์ž๋“ค์„ ๋ณ€ํ™˜ํ•˜๋Š” ์žฅ์น˜๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ฉด์—์„œ ๋‹ค์†Œ ๊ทธ ๊ธฐ๋Šฅ์ด ๋–จ์–ด์ง€๋Š”๋‹จ์ ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์•ž์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‚จ์€ ์ง€๋ฉด์„ ํ†ตํ•ด ์œ ๋‹ˆ์ฝ”๋“œ์™€ ์ „ํ†ต์ ์ธ ๋ฌธ์ž์„ธํŠธ๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ตญ์ œํ™” ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒWIN32 ํ”„๋กœ๊ทธ๋žจ์— ์ ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋งŽ์€ ์œˆ๋„์šฐ32 API๊ฐ€ ์ด๋ฏธ ์œ ๋‹ˆ์ฝ”๋“œ์™€ SBCS์„ ์ง€์›ํ•˜๋„๋ก ๋”ฐ๋กœ ๊ฐœ๋ฐœ๋˜์–ด์žˆ๋‹ค. ๋ฌผ๋ก  ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋‘ ๊ฐœ์˜๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด ANSI์šฉ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์œ ๋‹ˆ์ฝ”๋“œ API์™€ ํ˜ธํ™˜๋˜๊ฒŒํ•˜๋Š” ์ผ ๋˜ํ•œ ์ค‘์š”ํ•œ ๊ณผ์ œ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ANSI์šฉ API๋ž€ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ API๋ฅผ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” API ์ฐจ์›์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Šฅ๋ ฅ์œผ๋กœ ๋ณดํ†ต SBCS ๋˜๋Š” DBCS์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์–ด ์™”๋‹ค. ๋ฐ˜๋ฉด์— ์œ ๋‹ˆ์ฝ”๋“œ์šฉAPI๋ผ๋Š” ๊ฐœ๋…์€ API ์ฐจ์›์—์„œ 16๋น„ํŠธ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ฐœ๋ฐœ๋œ API๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์œˆ๋„์šฐ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋‹ค์ด์–ผ๋กœ๊ทธ๋ฐ•์Šค MessageBox()๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž. ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ๋Š” โ€˜MessageBox()โ€™๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‹ค์ œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€์‚ฌ์šฉํ•˜๋Š” MessageBox() ๋ฒ„์ „์€ MessageBoxA() ๋˜๋Š” MessageBoxW() ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค. ์–ด๋Š ๋ฒ„์ „์„์‚ฌ์šฉํ•˜๋Š๋ƒ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ 16๋น„ํŠธ ์ฝ”๋“œ์ธ ์œ ๋‹ˆ์ฝ”๋“œ ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“ค ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด 8๋น„ํŠธ ์ฝ”๋“œ ANSI ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“ค ๊ฒƒ์ธ์ง€์—๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ํŒŒ์ผ์˜ ๊ด€์ ์—์„œ ๋ณผ๋•Œ, ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? ๋ฌผ๋ก  ์ง€๊ธˆ๊นŒ์ง€์˜ ์„ค๋ช…์„ ์ข…ํ•ฉํ•ด ๋ณผ ๋•Œ ์œ ๋‹ˆ์ฝ”๋“œ๋Š” 16๋น„ํŠธ๋ฅผ์‚ฌ์šฉํ•˜๋ฏ€๋กœ 8๋น„ํŠธ ๋ฒ„์ „์— ๋น„ํ•ด ๋‘ ๋ฐฐ์˜ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋จ์„ ์•Œ๊ณ ์žˆ๋‹ค. ๋˜ํ•œ OS์˜ ๋ฌธ์ž์ฒ˜๋ฆฌ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋‹ค๋ฅผ๋•Œ๋Š” ๋ฌธ์ž ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์ด๋ก ์ ์œผ๋กœ ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Œ์„ ์„ค๋ช…ํ•œ ๋ฐ” ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‹ค์Œ๊ณผ๊ฐ™์€ ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.


char charV;

char * pch;

์œˆ๋„์šฐ32 ์•„ํ‚คํ…์ฒ˜์—์„œ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ์˜ charV๋Š” 1 ๋ฐ”์ดํŠธ ๋ณ€์ˆ˜๋กœ์„œ ๊ทธ ๊ฐ’์€ โ€˜\0โ€™๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.์—ฌ๊ธฐ์„œ charV์— โ€˜Aโ€™๋ฅผ ํ• ๋‹นํ•˜๋ฉด (charV=โ€˜Aโ€™), charV๋Š” โ€˜Aโ€™์˜ ์ฝ”๋“œ๊ฐ’์ธ 0x41๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ์ค„์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํŠธ๋ฅผ pch๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, pch๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋Š” ์œˆ๋„์šฐ32 ์•„ํ‚คํ…์ฒ˜ ์ƒ4๋ฐ”์ดํŠธ(32๋น„ํŠธ)๊ฐ€ ๋œ๋‹ค. pch=โ€œABCDโ€์ฒ˜๋Ÿผ ํ–ˆ์„ ๋•Œ โ€˜ABCDโ€™๋Š” 5๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด(โ€˜0x41โ€™, โ€˜0x42โ€™,โ€˜0x43โ€™, โ€˜0x44โ€™, โ€˜0x00โ€™)๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค. ํ•œํŽธ, ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ charV๋Š” 2 ๋ฐ”์ดํŠธ ๋ณ€์ˆ˜๋กœ๋ณ€ํ•˜๋ฉฐ ๋”ฐ๋ผ์„œ ๊ทธ ๊ฐ’์€ 0x0041์ด ๋˜๋ฉฐ, ํฌ์ธํ„ฐ๋กœ ์ •์˜๋œ pch๋Š” ๊ทธ ์ž์‹ ์˜ ํฌ๊ธฐ๋Š” ๋ณ€ํ•จ์—†์ด 4๋ฐ”์ดํŠธ์ด๋‚˜ โ€˜ABCDโ€™์˜ ๊ฐ’์€โ€˜0x0041โ€™, โ€˜0x0042โ€™, โ€˜0x0043โ€™, โ€˜0x0044โ€™, โ€˜0x0000โ€™๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฏ€๋กœ 12๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด์ด๋˜๋Š” ์…ˆ์ด๋‹ค. ANSI ๋ฌธ์ž์™€ UNICODE ์ฒ˜๋ฆฌ์— ์žˆ์–ด์„œ์˜ ์ด๋Ÿฌํ•œ ์ฐจ์ด๋Š” ์•ฝ๊ฐ„์˜ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์˜ ๋ณ€ํ™”๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ž…, ์ถœ๋ ฅ ์†Œ์Šค๋กœ ์˜ˆ์ƒํ•˜๊ณ  ์žˆ๋Š” ์œˆ๋„์šฐ NT์—์„œ ANSI ์ŠคํŠธ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๊ทธ ์ˆœ์„œ๋ฅผ๋ณด๋ฉด ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


1. ANSI ์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋žจ์—์„œ ANSI ๋ฌธ์ž์—ด์„ ์œˆ๋„์šฐ NT์˜ ์œˆ๋„์šฐ ์‹œ์Šคํ…œ์œผ๋กœ ๋ณด๋‚ธ๋‹ค

2. ์œˆ๋„์šฐ NT์˜ ์œˆ๋„์šฐ ์‹œ์Šคํ…œ์€ ์ž…๋ ฅ๋œ ANSI ๋ฌธ์ž์—ด์„ 16๋น„ํŠธ ๋ฌธ์ž์—ด ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์œˆ๋„์šฐ NT์˜ OS๋กœ ๋ณด๋‚ธ๋‹ค.

3. ์œˆ๋„์šฐ OS๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ›„ ๊ทธ ๋ฐ˜ํ™˜๊ฐ’์„ ์œˆ๋„์šฐ NT ์œˆ๋„์šฐ ์‹œ์Šคํ…œ์œผ๋กœ ๋ณด๋‚ธ๋‹ค

4. ์œˆ๋„์šฐ NT ์œˆ๋„์šฐ ์‹œ์Šคํ…œ์€ ๋‹ค์‹œ ์ด ๊ฐ’์„ ANSI ์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณด๋‚ธ๋‹ค. ์ด ๋•Œ ANSI ์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋žจ์ดANSI๊ฐ’์„ ์˜ˆ์ƒํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์œˆ๋„์šฐ NT ์‹œ์Šคํ…œ์€ ์œˆ๋„์šฐ NT OS์—์„œ ๋ฐ˜ํ™˜๋ฐ›์€ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์„ ANSI ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ANSI์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณด๋‚ธ๋‹ค.


์œˆ๋„์šฐ NT๋Š” native unicode, ์ฆ‰ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์ฒ˜์Œ๋ถ€ํ„ฐ ๋””์ž์ธ๋œ OS์ด๋‹ค. ์œˆ๋„์šฐ NT๋Š” ๋ฌธ์ž์—ด์ฒ˜๋ฆฌ์— ์žˆ์–ด์„œ 16๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋‚˜ ์•„์ง ๋Œ€๋ถ€๋ถ„์ด 8๋น„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ NT๋Š” ์œ„์—์„œ ๋‚˜์—ดํ•œ๋Œ€๋กœ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ์…ˆ์ด๋‹ค.

์œˆ๋„์šฐ 9x๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๊ฑฐ์˜ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ˜„ ์‹œ์ ์—์„œ์˜ ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ์—ญ์‹œ ANSI์™€ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๋™์‹œ์—์ง€์›ํ•˜๋Š” ์†Œ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ œ ๋‚จ์€ ์ง€๋ฉด์„ ํ†ตํ•ด SBCS์™€ ์œ ๋‹ˆ์ฝ”๋“œ์™€์˜ ๊ด€๊ณ„๋ฅผ API ์ฐจ์›์—์„œ ์‚ดํŽด๋ณด๋ฉด์„œ ์œ ๋‹ˆ์ฝ”๋“œ,DBCS ๊ทธ๋ฆฌ๊ณ  SBCS๊ณผ ๊ด€๋ จ๋œ API๋“ค์„ ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.


Uncode ํ”„๋กœ๊ทธ๋žจ

์ผ๋ฐ˜์ ์œผ๋กœ, ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฝ”๋”ฉํ•œ๋‹ค๊ณ  ๋งํ•  ๋•Œ ๋ฌธ์ž์„ธํŠธ ์‚ฌ์šฉ์˜ ๊ด€์ ์—์„œ ๋ณธ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ยทANSI ๋ฒ„์ „ : ANSI ๋ฌธ์ž๋งŒ ์ˆ˜์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

ยทUNICODE ๋ฒ„์ „ : Unicode ๋ฌธ์ž๋งŒ ์ˆ˜์šฉํ•˜๋Š” ๋ฒ„์ „

ยทํ†ตํ•ฉ๋ฒ„์ „ : ์œ ๋‹ˆ์ฝ”๋“œ์™€ ANSI๋ฅผ ๋™์‹œ์— ์ˆ˜์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ    


์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋“ ์ง€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋กœ์ง์€ ๋งํ•  ํ•„์š”์—†์ด ๋™์ผํ•˜๋‹ค. ๋‹ค๋งŒ ๋‹ค๋ฅธ ์ ์ด๋ผ๋ฉด ์œ ๋‹ˆ์ฝ”๋“œ์—์„œ๋Š” 16๋น„ํŠธ๋กœ ๋ฌธ์ž๋ฅผ์ฒ˜๋ฆฌํ•˜๋ฉฐ(ANSI ๋ฒ„์ „), ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฒ„์ „ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ head ํŒŒ์ผ์„ ๋ง๋ถ™์ด๋ฉฐ(UNICODE๋ฒ„์ „) ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์Šค ํŒŒ์ผ์— _UNIC ODE๋ฅผ ์ •์˜ํ•ด ์ฃผ๋Š” ๊ฒƒ(ํ†ตํ•ฉ๋ฒ„์ „) ๋“ฑ์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์œˆ๋„์šฐ32 API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌํ•˜๋‚˜์˜ ์†Œ์Šคํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ์œ ๋‹ˆ์ฝ”๋“œ์™€ ANSI I/O๋ฅผ ๋™์‹œ์— ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”์ง€๋ฅผ ์ฃผ๋กœ Run-Time์—์„œ ์‚ฌ์šฉ๋˜๋Š”๋ฌธ์ž์—ด์˜ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ API๋“ค์„ ์•Œ์•„๋ณด๊ณ  ๋์œผ๋กœ i18n๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ WIN32 API๋“ค์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์šฐ์„  ๊ฐ€์žฅ ๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ์ดํ•ดํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋ฐ”๋กœ ์œ ๋‹ˆ์ฝ”๋“œ ๋˜๋Š” Wide Character(WC)๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š”โ€˜WCHAR.Hโ€™ ํŒŒ์ผ์ด๋‹ค. C๋‚˜ C++์—์„œ ์ •์˜ํ•˜๋Š” WC๋Š” ๋‹ค๋ฅธ ์–ด๋Š ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จ์ˆœํ•˜๋‹ค.


typedef unsigned short wchar_t;

wchar_t c = Lโ€˜Aโ€™์—์„œ, c์˜ ๊ฐ’์€ 0x0041์ด ๋œ๋‹ค. CPU์—์„œ 0x0041์ด ์ €์žฅ๋  ๋•Œ๋Š” LSB(LeastSignifica nt Byte)์„ ๋จผ์ € ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ 0x0041์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋Š” ์‚ฌ์‹ค โ€˜41 00โ€™๋กœ ์ €์žฅ๋œ๋‹ค. ๋˜ํ•œwchar_t * p = Lโ€œABCDโ€;๋ผ๊ณ  ์ •์˜ํ–ˆ๋‹ค๋ฉด CPU๊ฐ€ p์˜ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ๋•Œ๋Š” โ€˜4100 4200 43004400โ€™์ฒ˜๋Ÿผ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์œ ์˜ํ•ด์•ผ ํ•  ์ ์€ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์„ WC๋กœ ์ •์˜ํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ WC๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋ ‡์ง€์•Š์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฐ’ 41์„ ์ฝ์€ ํ›„ 00๊ฐ€ ๋‹ค์Œ ๋ฌธ์ž๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ๋ฌธ์ž์—ด์˜ ๋์ด ๋˜์–ด ๋ฒ„๋ฆฌ๋Š” ์…ˆ์ด๋‹ค. ๋„ˆ๋ฌด ๋‹น์—ฐํ•œ ์ด์น˜์ด์ง€๋งŒ์ž์นซ ์ž˜๋ชปํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๊ธฐ๋„ ํ•˜๋‹ค. ์žฌ๋ฏธ ์‚ผ์•„ ๋‹ค์Œ ์ฝ”๋”ฉ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด ๋ณด์ž.


wchar_t * p = Lโ€œABCDโ€;

    printf(โ€œ%dโ€, strlen(p));

strlen() ๋Ÿฐ-ํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” WC๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ณ ์•ˆ๋˜์ง€ ์•Š์•˜๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ ์ถœ๋ ฅ๊ฐ’์€ 1์ด ๋  ๊ฒƒ์ด๋‹ค.


int strlen (const char * str)

       {

           int length = 0;

           while( *str++ )

                   ++length;

           return( length );

}

stelen()์„ wcslen()์œผ๋กœ ๋Œ€์น˜์‹œํ‚ค๋ฉด ์ œ ๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. wcslen()์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 2 ๋ฐ”์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ ์ž…๋ ฅ๋˜๋Š” ๋ฌธ์ž์˜ ์„ฑ์งˆ์— ๋ฌด๊ด€ํ•˜๊ฒŒ 2 ๋ฐ”์ดํŠธ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.  


size_t __cdecl wcslen(const wchar_t *wcs)

{

    const wchar_t * eos = wcs;

    while(*eos++);

    return ((size_t) (eos - wcs -1));

}


๋”ฐ๋ผ์„œ strlen()์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ˜๋Œ€์˜ ์˜ค๋ฅ˜๊ฐ€ wcslen()์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, strlen()๋ฅผ ์ •์ž‘์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ณณ์— wcslen()์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ ๊ฐ’์ด ๋ฐ˜์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผstrlen()์ด๋‚˜ wcslen()์„ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (WC์™€ SBCS์˜ ๋‘ ๊ฐ€์ง€ ํ™˜๊ฒฝ์—์„œ ํ•˜๋‚˜์˜ ์†Œ์Šค์ฝ”๋“œ๋กœ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด), ๋‹ค์‹œ ๋งํ•ด์„œ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตญ์ œํ™”๋ฅผ ์ด๋ฃจ๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋Š”๊ฐ€?

์ด์— ๋Œ€ํ•œ ๋‹ต์€ ๋ฐ”๋กœ ํ†ตํ•ฉํ˜• ๋ฒ„์ „์˜ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ—ค๋“œํŒŒ์ผ์€ TCHAR.H์ด๋‹ค. โ€˜#_UNICODEโ€™์™€โ€˜#define TCHAR.Hโ€™์ด ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์— ์ •์˜๋˜์—ˆ์„ ๋•Œ ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ์œ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ˆ˜์ •ํ•ด ์ฃผ๋ฏ€๋กœ_UNICODE๊ฐ€ ์ •์˜๋˜์—ˆ์œผ๋ฉด _tstrlen()๋Š” wcslen()๋กœ ์‹คํ–‰ํ•˜๊ณ , _UNCODE๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด_tstrlen()๋Š” strlen()๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.


#define _UNICODE

    #include <TCHAR.H>


    wchar_t * p = Lโ€œABCDโ€;

    printf(โ€œ%dโ€, _tstrlen(p));


๋ฌธ์ž์—ด์„ WC ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ๋ฐ”๋กœ ์•ž์— L์„ ๋ง๋ถ™์—ฌ ์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•œ ๋ฐ” ์žˆ๋‹ค. ํ•˜์ง€๋งŒ๋ฐ˜๋“œ์‹œ WC๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋ฌธ์ž์—ด ์ €์žฅ ๋ฐฉ๋ฒ• ์—ญ์‹œ ์œ„์—์„œ ์„ค๋ช…ํ•œ Run-Time Library์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•œ๋ฐ, TEXT()๊ฐ€ ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๋‹ค.


ifdef UNICODE #define __T(x) L##x

else #define __T(x) x

. . .

#define _T(x)  __T(x)

. . .

#define _TEXT(x) __T(x)

. . .

#define TEXT(x) _TEXT(x)

์œ„์˜ ๋กœ์ง์€ ๋‹จ์ˆœํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, UNCODE๊ฐ€ ์ •์˜๋˜์—ˆ์œผ๋ฉด __T(โ€œABCEโ€)๋ฅผ Lโ€œABCDโ€๋กœ ๋ณ€ํ™˜ํ•˜๊ณ UNICODE๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฉด __T(โ€œABCDโ€)๋Š” ๊ธฐ๋ณธํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ง€์‹œ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธํ˜•ํƒœ๋ž€ ANSI ๋ฌธ์ž์„ธํŠธ๋ฅผ์˜๋ฏธํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  __T๋Š” _T ๋˜๋Š” _TEXT๋กœ ๋ณ€ํ™˜๋˜๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๋งคํฌ๋กœ๋Š” _TEXT()์˜ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.๋งจ ๋งˆ์ง€๋ง‰ ์ค„์˜ โ€˜define TEXT(x) _TEXT(x)โ€™๋Š” winnt.h์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ ์žˆ๋Š”๋ฐ ๊ฐ„๋‹จํ•˜๊ฒŒโ€˜windows.hโ€™๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉด ์ด๋Ÿฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฑฑ์ •ํ•  ํ•„์š”์—†์ด ๋ฌธ์ž์—ด์„ ํ•ญ์ƒ TEXT๋กœ ๊ฐ์‹ธ์ฃผ๋ฏ€๋กœ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์–ด์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์—์„œ ์‚ฌ์šฉ๋œ ๋กœ์ง์„ ์—ผ๋‘์— ๋‘๊ณ  ๋‹ค์‹œ ์ˆ˜์ •ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


#define _UNICODE

#include <TCHAR.H>


TCHAR * p = TEXT(โ€œABCDโ€);


printf(โ€œ%dโ€, _tstrlen(p));


๋…์ž์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.

๋ณธ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ํ˜•ํƒœ๋กœ ์ˆ˜์ •ํ•ด ๊ฐ€๋ฉด์„œ ๋ณธ ๊ธ€์—์„œ ๋ช…์‹œ๋œ ํ”„๋กœ๊ทธ๋žจ ๊ตญ์ œํ™”์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋“ค์„ ํ•˜๋‚˜์”ฉ ์‹ค์Šตํ•ด ๋ณด๊ธฐ๋ฐ”๋ž€๋‹ค.  


#define _UNICODE


#include <TCHAR.H>


#include <windows.h>


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

        LPSTR lpCmdLine, int nCmdShow)

{

    TCHAR *wc = TEXT(โ€œABCDโ€);

    TCHAR msg[80];


    wsprintf(msg,โ€œ_tcslen=%u, sizeof(msg)=%uโ€,

          _tcslen(wc),sizeof(msg));

    MessageBox(NULL, msg, โ€œUNICODEโ€, MB_OK);


    return 0;

}


์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตญ์ œํ™”์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ •์˜์— ๋Œ€ํ•œ ์ง€๊ธˆ๊นŒ์ง€์˜ ์„ค๋ช…์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


/* Generic types */

#ifdef UNICODE

  typedef wchar_t TCHAR;

 #else

  typedef unsigned char TCHAR;

#endif

typedef TCHAR * LPTSTR, *LPTCH;


/* 8-bit character specific */

typedef unsigned char CHAR;

typedef CHAR *LPSTR, *LPCH;


/* Unicode specific (wide characters) */

typedef unsigned wchar_t WCHAR;

typedef WCHAR *LPWSTR, *LPWCH;

๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š” Win32 API๋“ค์€ ๋Œ€๊ฐœ๊ฐ€ ๋‘๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ ํ•˜๋‚˜๋Š” API ์ด๋ฆ„์ด A๋กœ ๋๋‚˜๋Š”๊ฒƒ์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ทธ ์ด๋ฆ„์ด W๋กœ ๋๋‚˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ A๋Š” ANSI ํ‘œ์ค€์„ ์˜๋ฏธํ•˜๊ณ  W๋Š” Wide ๋ฌธ์ž, ์ฆ‰ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ†ตํ•ฉํ˜• API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  xxxA() ๋˜๋Š”xxxW()์™€ ๊ฐ™์ด ํŠน์ • API๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ถ€๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ํ•„์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ์ด์œ  ๋•Œ๋ฌธ์— ์–ธ์ œ๋‚˜ ํ†ตํ•ฉํ˜• API๋ฅผ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒํ•˜๊ณ  ์‹ถ๋‹ค.


ยท์ฝ”๋“œ์˜ ํฌํŒ…์ด ์‰ฝ๋‹ค (WIN NT, Win9x)

ยท์ฝ”๋”ฉ์ด ์šฉ์ดํ•˜๋‹ค

ยทํ”„๋กœ๊ทธ๋žจ์„ ๊ตญ์ œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค


์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํฌํŒ…์ด๋ž€ ๋‹จ์ˆœํžˆ ์œˆ๋„์šฐ NT์™€ ์œˆ๋„์šฐ 95/98 ๊ฐ„์˜ ํฌํŒ…์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด์ปดํŒŒ์ผ ํ•  ๋•Œ, ์œˆ๋„์šฐ NT์šฉ์ด๋ฉด UNICODE๋ฅผ ์ •์˜ํ•ด ์ฃผ๊ณ , 95/8์šฉ์ด๋ฉด UINCODE๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋กœ์ธํ•ด ํ†ตํ•ฉํ˜•API๋“ค์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ ์ ˆํ•œ API๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ฝ”๋”ฉ ๋˜ํ•œ ์šฉ์ดํ•˜๊ฒŒ๋˜๋ฉฐ, ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „ ์„ธ๊ณ„์˜ ๋ชจ๋“  ์ธ์ฝ”๋”ฉ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตญ์ œํ™”๋ฅผ ์‰ฝ๊ฒŒ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.๋ฌธ์ž์—ด์˜ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ API๋“ค์˜ ๋งคํฌ๋กœ๋Š” ๋Œ€๋žต lstrcatA(W), lstrc mp(wcscmp),lstrcmpi(wcscmpi), lstrcpy, lstrlen, lstrcmp and lstrcmpi ๋“ฑ์ด ์žˆ์œผ๋ฉฐ ์ด ์ค‘lstrcatA(W), lstrcmp(wcscmp), lstrcmpi(wcscm pi), lstrcpy, lstrlen์€ ๊ฐ™์€์ผ์„ ํ•˜๋Š” ๋‘๊ฐœ์˜ API๊ฐ€ ์žˆ์œผ๋ฉฐ, lstrcmp and lstrcmpi์€ CompareString()๋ฅผ ๋ถˆ๋Ÿฌ UNICODE์™€ANSI๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ API ๋งคํฌ๋กœ๋“ค์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋ฐ”๋ž€๋‹ค. ์•ž์„œ ์•ฝ์†ํ•œ ๋Œ€๋กœ, ์œ ๋‹ˆ์ฝ”๋“œ ๋ฐ ANSI์™€ ๊ด€๋ จ๋œ WIN32 API๋“ค ์ค‘ ์šฐ๋ฆฌ๊ฐ€ ์ดํ•ดํ•˜์—ฌ์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ API๋“ค์„ ๋‚˜์—ดํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


GetCPInfo

MultiByteToWideChar

WideCharToMultiByte

IsTextUnicode

IsDBCSLeadByte

IsWindowUnicode

CharNext,

CharPrev

GetInfo()๋Š” CPINFO ์ŠคํŠธ๋Ÿญ์ฒ˜์— ๋กœ์ผ€์ผ์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ฑ„์›Œ์ฃผ๋ฉฐ CPINFO์— ํฌํ•จ๋˜๋Š” ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


struct _cpinfo {  

    UINT MaxCharSize;

    BYTE DefaultChar[MAX_DEFAULTCHAR];

    BYTE LeadByte[MAX_LEADBYTES];

} CPINFO;


MaxCharSize๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ์ค‘์ธ ์ฝ”๋“œํŽ˜์ด์ง€ ๋‚ด์—์„œ์˜ ๋ฌธ์ž์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ์ฝ”๋“œํŽ˜์ด์ง€ 949ํ•œ๊ธ€ ์™„์„ฑํ˜•์˜ ๊ฒฝ์šฐ๋Š” SBCS๊ณผ DBCS์ด ํ˜ผํ•ฉ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ MaxCharSize๋Š” ๋‘ ๋ฐ”์ดํŠธ, ์ฆ‰ 2๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.DefaultChar๋ž€ ๋‹ค๋ฅธ ๋ฌธ์ž ์„ธํŠธ๊ฐ€ ํ˜„ ์‹œ์Šคํ…œ์˜ ์ฝ”๋“œํŽ˜์ด์ง€๋กœ ๋ณ€ํ™˜๋  ๋•Œ ์‚ฌ์šฉํ•  ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ด๊ฒƒ์€ WideCharToMultiByte์˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค. LeadByte๋ž€ ์‚ฌ์šฉ์ค‘์ธ ์ฝ”๋“œ ํŽ˜์ด์ง€์˜ LeadByte ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚˜๋ฉฐLeadByte๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” LeadByte[]๋Š” NULL๋กœ ์ฑ„์›Œ์ง„๋‹ค. MultiByteToWideChar์™€WideCharToMulti Byte๋Š” SBCS๊ณผ DBCS์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž๋“ค์„ ๋งคํ•‘ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ,IsTextUnicode๋Š” ๋Œ€์ƒ ๋ฌธ์ž์—ด ์ค‘ UNICODE๊ฐ€ ํฌํ•จ๋˜์—ˆ๋Š”์ง€๋ฅผ ์•Œ์•„๋‚ด๋ คํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. WIN9x์˜ ๊ฒฝ์šฐ๋Š”UNICODE๋ฅผ ๊ฑฐ์˜ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณธ API๋Š” ์‹œ์Šคํ…œ ์ฐจ์›์—์„œ ๋ฌด์‹œ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  IsDBC SLeadByte๋Š” ๋Œ€์ƒ ๋ฌธ์ž๊ฐ€DBCS์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์ธ์ง€๋ฅผ ์•Œ๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, IsWindow Unicode๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œˆ๋„์šฐ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฌธ์ž์—ด์˜ ํƒ€์ž…์ด UNICODE์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•œ ์ˆ˜ ์žˆ๋‹ค.

๋์œผ๋กœ CharNext์™€ CharPrev๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์— ์˜ค๋Š” ๋ฌธ์ž๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‘ API๋Š” WIN16ANSI C๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด AnsiNext์™€ AnsiPrev๋ฅผ ์—ฐ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. WIN32์—์„œ๋Š” ์ด์ „ ์ฝ”๋“œ์™€์˜ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.


#define AnsiNext CharNext

#define AnsiPrev CharPrev

๋ฐ˜์‘ํ˜•

+ Recent posts