1. ์ธ์ฝ๋ฉ(Encoding)๋?
์ฝ๋ํ(๋ฌธ์์ ๋ฒํธ๋ฅผ ์ปดํจํฐ์์ ํํํ๋ ๋ฐฉ๋ฒ), ์ํธํ๋ฅผ ์๋ฏธํ๋ฉฐ ๋ฐ๋๋ง์ ๋์ฝ๋ฉ(decoding)์ด๋ค. ์ด๋ค ์ ๋ณด๋ฅผ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ๋ณํํ๋ ๊ฒ(en-code-ing)์ ์ผ์ปซ๋๋ค.
2. ์ ๋์ฝ๋(Unicode)๋?
์ ๋์ฝ๋๋ ์ ์ธ๊ณ์ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ด์ ์ธ๊ณ๊ณตํต ์ฝ๋ ์งํฉ์ ๋ง๋ค์ด ๋ชจ๋๊ฐ ์ด ์งํฉ์ผ๋ก ์ธํด ์ธ์ด๋ฅผ ๊ตฌํํ์๋ ์๋๋ก ๋ง๋ค์ด์ก๋ค. ๊ฐ๋จํ ๋งํด, ์ ๋์ฝ๋(unicode)๋ ๋ชจ๋ ๋ฌธ์์ index๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ด๋ค.
( index ์ฐธ๊ณ : http://www.unicode.org/charts/)
โป ํ๊ธ๊ณผ ๊ฐ์ด ๋ชจ์, ์์, ์ด์ฑ, ์ค์ฑ์ ์กฐํฉ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง ๊ธ์๋ฅผ ํํํ ์ ์๋ ์ธ์ด๋ index๋ก ๋ชจ๋ ์ค ์ ์๋ค. ๊ทธ๋์ ์ ๋์ฝ๋๋ ์์ ํ ๊ธ์๋ฅผ ์ ๊ณตํด ์ฃผ๊ธฐ๋ ํ์ง๋ง, ๊ธ์๋ฅผ ์กฐ๋ฆฝํ ์ ์๋๋ก ์กฐ๋ฆฝ๊ฐ๋ฅํ ๊ธ์๋ฅผ ์ ๊ณตํด์ค๋ค.( Hangul Jamo - Korean combining alphabet - http://www.unicode.org/charts/PDF/U1100.pdf )
index๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์๋ UTF(Unicode Transformation Format)์ UCS(Universal Character Set) ๋๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
์ ๋๋ฒ์ค ๋ฌธ์ ์งํฉ(Universal Character Set, UCS)์ ISO 10646์ด๋ผ๋ ๊ตญ์ ํ์ค์ด๊ณ , ์ ๋์ฝ๋๋ ๊ตญ์ ํ์ค ๋ฌธ์ ์งํฉ๋๋ค. ๋ ๋ค ์ญ๋ง ๊ฐ ์ด์์ ๋ฌธ์๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ, ๊ฐ ๋ฌธ์๋ง๋ค ๊ณ ์ ์ด๋ฆ๊ณผ ์ฝ๋ ํฌ์ธํธ๊ฐ ์ ํด์ ธ ์๋ค. ๋ ํ์ค ๋ชจ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ๋ฐ๋ก ์ ํด๋๊ณ ์๋ค.
์ ๋์ฝ๋๋ ํ ๋ฌธ์๋ฅผ 1~4๊ฐ์ 8๋นํธ๋ก ์ธ์ฝ๋ฉํ๋ UTF- 8๋ฐฉ์, ํ ๋ฌธ์๋ฅผ 1~2๊ฐ์ 16๋นํธ๋ก ์ธ์ฝ๋ฉํ๋ UTF- 16๋ฐฉ์, ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์ ํํ 32๋นํธ๋ก ์ธ์ฝ๋ฉํ๋ UTF - 32 ๋ฐฉ์์ด ์๋ค.
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ์ดํ๋ฆฌ์ผ์ด์ ์ ํ์งํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ๊ทํํ์์ ์ด์ฉํ ๋ง๊ฐํ ๋งค์นญ ๊ตฌํ ๋ฐฉ๋ฒ์ ์์๋ณด์.
C๋ C++ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์ธ ๋ ๊ฐ๊ฐ์ ๋ฌธ์๋ฅผ ์์คํค(ASCII) ์ฝ๋๋ฅผ ํํํ๋ ๋ฐ์ดํธ๋ก ์ทจ๊ธํ๋ค. ์์คํค ์ฝ๋๋ 7๋นํธ๋ก ๊ตฌ์ฑ๋์ผ๋ฉฐ ์ฃผ๋ก 8๋นํธ char ํ์ ์ผ๋ก ํํํ๋ค.
ํ์งํ์์ ๊ฐ์ฅ ์ค์ํ ์์น ์ค ํ๋๋ ์์ค ์ฝ๋์ ํน์ ์ธ์ด๋ก ๋ ์คํธ๋ง์ ์ ๋๋ก ๋ฃ์ผ๋ฉด ์๋๋ค๋ ๊ฒ์ด๋ค. ๋ง์ดํฌ๋ก์ํํธ ์๋์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ํ๊ฒฝ์์๋ ํ์งํ์ ๊ด๋ จ๋ ์คํธ๋ง์ STRINGTABLE์ด๋ ๋ฆฌ์์ค๋ก ๋ฐ๋ก ๋นผ๋๋ค.
ํจ์: Format( ) ์คํธ๋ง ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฌ์ค๋ฉด์ $1์ ํด๋นํ๋ ๋ถ๋ถ์ n์ด๋ ๊ฐ์ผ๋ก ๋์ฒดํ๋ค.
1. ์์ด๋ ๋ฌธ์
๋ชจ๋ ์ธ์ด๊ฐ ํ ๋ฌธ์๋ฅผ 1๋ฐ์ดํธ, ์ฆ 8๋นํธ์ ๋ด์ ์ ์๋ ๊ฒ์ ์๋๋ค. c++๋ wchar_t๋ผ๋ ์์ด๋ ๋ฌธ์(ํ์ฅ ๋ฌธ์) ํ์ ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค. ํ๊ตญ์ด๋ ์๋์ด์ฒ๋ผ ์์คํค ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ธ์ด๋ c++์์ wchar_tํ์ ์ ํํํ๋ฉด ๋๋ค.ํ์ง๋ง c++ํ์ค์ wchar_t์ ํฌ๊ธฐ๋ฅผ ๋ช ํํ ์ ์ํ์ง ์๊ณ ์๋ค. ์ด๋ค ์ปดํ์ผ๋ฌ๋ 16๋นํธ ๋ฐ๋ฉด ๋ค๋ฅธ ์ปดํ์ผ๋ฌ๋ 32๋นํธ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ ํ๋ค. ๊ทธ๋์ ํฌ๋ก์ค ํ๋ํผ์ ์ง์ํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด wchar_t์ ํฌ๊ธฐ๊ฐ ์ผ์ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ํํ๋ค. (c++์์ ์ ๊ณตํ๋ char16_t , char32_t๋ฅผ ์ด์ฉํ๋ฉด ๋ฌธ์ ์ ๋์ฒํ๋ ๋ฐ ๋์ ๋๋ค.)
์คํธ๋ง์ด๋ ๋ฌธ์ ๋ฆฌํฐ๋์ wchar_tํ์ ์ผ๋ก ์ง์ ํ๋ ค๋ฉด ๋ฆฌํฐ๋ ์์ L์ ๋ถ์ด๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ด๋ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ ์ฉํ๋ค. ํํ ์ฌ์ฉํ๋ ํ์ ์ด๋ ํด๋์ค๋ง๋ค ์์ด๋ ๋ฌธ์ ๋ฒ์ ์ด ์กด์ฌํ๋ค.
wchar_t wStringMsg = L'm';
(string - wstring)
์ ์ถ๋ ฅ ์์ด๋ ๋ฌธ์ ๋ฒ์ :
(cout - wcout), (cin - wcin), (cerr - wcerr), (clog - wclog)
(ofstream - wofstream), (ifstream - wifstream)
using u16string = basic_string<char16_t>
using u32string = basic_string<char32_t>
โป c++์์ ์ ๊ณตํ๋ ์คํธ๋ง ์ ๋์ด
- u8 : UTF-8 ์ธ์ฝ๋ฉ์ ์ ์ฉํ char ์คํธ๋ง
- u : char16_t ์คํธ๋ง ๋ฆฌํฐ๋์ ํํํ๋ฉฐ, ์ปดํ์ผ๋ฌ์ __STDC_UTF_16__์ด ์ ์๋ผ ์์ผ๋ฉด UTF-16์ ์ ์ฉํ๋ค.
- U: char32_t ์คํธ๋ง ๋ฆฌํฐ๋์ ํํํ๋ฉฐ, ์ปดํ์ผ๋ฌ์ __STDC_UTF_32__๊ฐ ์ ์๋ผ ์์ผ๋ฉด UTF-32๋ฅผ ์ ์ฉํ๋ค.
- L: wchar_t ์คํธ๋ง ๋ฆฌํฐ๋์ ํํํ๋ฉฐ, ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ปดํ์ผ๋ฌ๋ง๋ค ๋ค๋ฅด๋ค.
2. ๋ณํ
C++ํ์ค์์๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์๋ฅผ ์ฝ๊ฒ ๋ณํํ๋๋ก codecvt๋ผ๋ ํด๋์ค ํ ํ๋ฆฟ์ ์ ๊ณตํ๋ค.
<locale>ํค๋ ํ์ผ์ ๋ณด๋ฉด ๋ค ๊ฐ์ง ์ธ์ฝ๋ฉ ๋ณํ ํด๋์ค๊ฐ ์ ์ ๋ผ ์๋ค.
codecvt<char, char, mbstate_t> | ํญ๋ฑ ๋ณํ, ์ฆ ๊ฐ์ ๊ฒ๋ผ๋ฆฌ ๋ณํํด์ ์ค์ง์ ์ผ๋ก ๋ณํ์ด ์ด๋ค์ง์ง ์๋๋. |
codecvt<char16_t, char, mbstate_t> | UTF-16๊ณผ UTF-8์ ๋ณํํ๋ค. |
codecvt<char32_t, char, mbstate_t> | UTF-32๊ณผ UTF-8์ ๋ณํํ๋ค. |
codecvt<wchar_t, char, mbstate_t> | ์์ด๋ ๋ฌธ์์ ๋ด๋ก์ฐ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ๋ณํํ๋ค. |
C++17๋ถํฐ <codecvt>๋ผ๋ ํค๋ ํ์ผ ์ ์ฒด์ ๋๊ฐ์ง ๋ณํ ์ธํฐํ์ด์ค๊ฐ ํ๊ธฐ๋๋ค. C++ํ์ค ์์ํ๋ ์ด๋ฌํ ๊ฒ๋ค์ด ์๋ฌ ์ฒ๋ฆฌ์ ๋ถ๋ฆฌํ๋ค๋ ์ด์ ๋ก ํ๊ธฐํ๋๋ก ๊ฒฐ์ ํ๋ค. C++ํ์ค ์์ํ์์ ๋ณด์ ์ ํฉํ๊ณ ์์ ํ ๋์์ ๋ง๋ จํ ๋๊น์ง๋ ICU์ ๊ฐ์ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์.
3. ๋ก์ผ์ผ <locale>๊ณผ ํจ์ฏ
๋ฌธ์ ์งํฉ์ ๋๋ผ๋ง๋ค ๋ฐ์ดํฐ ํํํ๋ ๋ฐฉ์์ด ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ง ์์ ์ค ํ๋์ ๋ถ๊ณผํ๋ค. ๋ฌธ์๊ฐ ๋น์ทํ ๋๋ผ๋ง์ ๋ ๋ ์ง๋ ํํ๋ฅผ ํํํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค. ์ด๋ ๊ฒ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฌธํ์ ๋ฐฐ๊ฒฝ์ ๋ฐ๋ผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋ ๋ฐฉ์์ C++์์๋ ๋ก์ผ์ผ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ก์ผ์ผ์ ๋ ์ง ํฌ๋งท, ์๊ฐ ํฌ๋งท, ์ซ์ ํฌ๋งท ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋๋๋ฐ ์ด๋ฌํ ์์๋ฅผ ํจ์ฏ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. I/O์คํธ๋ฆผ์ ์ฌ์ฉํ ๋๋ ๋ฐ์ดํฐ์ ํฌ๋งท์ ํน์ ํ ๋ก์ผ์ผ์ ๋ง์ถ๋ค.
๋ฌธ์ ๋ถ๋ฅ
<locale> ํค๋ ํ์ผ์ std::isspace( ), isblank( ), iscntrl( ), isupper( ), islower( ), isalpha( ), isdigit( ), ispunct( ), isxdigit( ), isalnum( ), isprint( ), isgraph( ) ๋ฅ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ถ๋ฅ ํจ์๊ฐ ์ ์๋ผ ์๋ค. ์ด๋ค ํจ์๋ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋๋ค.
bool result = isupper('A', locale(""));
ํจ์ฏ
ํน์ ํ ๋ก์ผ์ผ์์ ํจ์ฏ์ ๊ตฌํ๋ ค๋ฉด std::use_facet( ) ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ค. ์ด๋ use_facet( )์ ์ธ์๋ก locale์ ์ง์ ํ๋ค. ์๋๋ c++ํ์ค์์ ์ ํ ํจ์ฏ์ ๋ฒ์ฃผ์ด๋ค.
๋ฏธ๊ตญ์ ์์ด์ ์๊ตญ์ ์์ด์ ๋ํ ๋ก์ผ์ผ๊ณผ ํจ์ฏ์ผ๋ก ๋ ๋๋ผ์ ํํ ๊ธฐํธ๋ฅผ ์ถ๋ ฅํ๋ ์์ ์ด๋ค.
Reference.
- [๋ฌธ์์ธ์ฝ๋ฉ] ์ ๋์ฝ๋, UTF-8, UTF-16, UTF-32 ๊ฐ๋จ ์ ๋ฆฌ. (ggaman.com)
- (๋์) ์ถ์ฒ: ์ ๋ฌธ๊ฐ๋ฅผ ์ํ c++ (๊ฐ์ 4ํ)
'๐จ๐ปโ๐ป programming > โฝ c, c++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!