์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค.
๋ฌธ์์ธํธ ๋ฐ ์ ๋์ฝ๋์ ๊ธฐ๋ณธ ๊ทธ๋ฆฌ๊ณ ์๋์ฐ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