1. 목표
1) window에서 한글 URL을 처리하기 위한 변환
2) Web에 window의 한글을 전달 하기 위한 변화
2. 핵심
Web에서는 URL encoding시 UTF-8 encoding을 사용합니다 그러나 window는 ANSI encoding을 사용합니다. 그래서 Web에서 사용하는 UTF-8 encoding을 window에서 사용하는 ANSI encoding으로 변경해야 합니다. 그러나 window에서는 UTF-8을 ANSI encodig로 한번에 변경할 수가 없습니다. 중간에 UNICODE로 변경 한 다음 ANSI로 변경해야 합니다.
2. 변환 과정 원리
1) window에서 한글 URL을 처리하기 위한 변환 과정 (utf8->ANSI(CP949) )
(1) URL -> UTF-8 decoding
(2) UTF-8 -> UNICODE
(3) UNICODE -> ANSI(CP949)
2) Web에 window의 한글을 전달 하기 위한 변화나 과정(ANSI(CP949) -> utf8)
(1) ANSI(CP949) -> UINICODE
(2) UNICODE -> UTF-8
3) window 핵심 함수
(1) uft-8 -> UNICODE 변환
MultiByteToWideChar()
(2) ANSI(CP949) -> UNICODE 변환
MultiByteToWideChar()
(3) UNICODE -> ANSI(CP949) 변환
WideCharToMultiByte()
(4) UNICODE -> uft-8 변환
WideCharToMultiByte()
3. 변경 코드
1) window에서 한글 URL을 처리하기 위한 변환 과정 (utf8 -> ANSI(CP949))
/*
* @brief 웹에서 사용하는 utf-8 인코딩을 window에서 사용하는 ANSI 인코딩으로 변경 합니다.
*/
std::string Utf8ToMultiByte(std::string utf8_str)
{
std::string resultString;
char *pszIn = new char[utf8_str.length() + 1];
strncpy_s(pszIn, utf8_str.length() + 1, utf8_str.c_str(), utf8_str.length());
int nLenOfUni = 0, nLenOfANSI = 0;
wchar_t* uni_wchar = NULL;
char* pszOut = NULL;
// 1. utf8 Length
if ((nLenOfUni = MultiByteToWideChar(CP_UTF8, 0, pszIn, (int)strlen(pszIn), NULL, 0)) <= 0)
return 0;
uni_wchar = new wchar_t[nLenOfUni + 1];
memset(uni_wchar, 0x00, sizeof(wchar_t)*(nLenOfUni + 1));
// 2. utf8 --> unicode
nLenOfUni = MultiByteToWideChar(CP_UTF8, 0, pszIn, (int)strlen(pszIn), uni_wchar, nLenOfUni);
// 3. ANSI(multibyte) Length
if ((nLenOfANSI = WideCharToMultiByte(CP_ACP, 0, uni_wchar, nLenOfUni, NULL, 0, NULL, NULL)) <= 0)
{
delete[] uni_wchar;
return 0;
}
pszOut = new char[nLenOfANSI + 1];
memset(pszOut, 0x00, sizeof(char)*(nLenOfANSI + 1));
// 4. unicode --> ANSI(multibyte)
nLenOfANSI = WideCharToMultiByte(CP_ACP, 0, uni_wchar, nLenOfUni, pszOut, nLenOfANSI, NULL, NULL);
pszOut[nLenOfANSI] = 0;
resultString = pszOut;
delete[] uni_wchar;
delete[] pszOut;
return resultString;
}
2) Web에 window의 한글을 전달 하기위한 변화나 과정(ANSI(CP949) -> utf8)
/*
* @brief window에서 사용하는 ANSI 인코딩을 웹에서 사용하는 utf-8 인코딩 인코딩으로 변경 합니다.
*/
std::string MultiByteToUtf8(std::string multibyte_str)
{
char *pszIn = new char[multibyte_str.length() + 1];
strncpy_s(pszIn, multibyte_str.length() + 1, multibyte_str.c_str(), multibyte_str.length());
std::string resultString;
int nLenOfUni = 0, nLenOfUTF = 0;
wchar_t* uni_wchar = NULL;
char* pszOut = NULL;
// 1. ANSI(multibyte) Length
if ((nLenOfUni = MultiByteToWideChar(CP_ACP, 0, pszIn, (int)strlen(pszIn), NULL, 0)) <= 0)
return 0;
uni_wchar = new wchar_t[nLenOfUni + 1];
memset(uni_wchar, 0x00, sizeof(wchar_t)*(nLenOfUni + 1));
// 2. ANSI(multibyte) ---> unicode
nLenOfUni = MultiByteToWideChar(CP_ACP, 0, pszIn, (int)strlen(pszIn), uni_wchar, nLenOfUni);
// 3. utf8 Length
if ((nLenOfUTF = WideCharToMultiByte(CP_UTF8, 0, uni_wchar, nLenOfUni, NULL, 0, NULL, NULL)) <= 0)
{
delete[] uni_wchar;
return 0;
}
pszOut = new char[nLenOfUTF + 1];
memset(pszOut, 0, sizeof(char)*(nLenOfUTF + 1));
// 4. unicode ---> utf8
nLenOfUTF = WideCharToMultiByte(CP_UTF8, 0, uni_wchar, nLenOfUni, pszOut, nLenOfUTF, NULL, NULL);
pszOut[nLenOfUTF] = 0;
resultString = pszOut;
delete[] uni_wchar;
delete[] pszOut;
return resultString;
}
4. Encoding관련 심화 과정
1) Encoding Code 표 종류
- Encoding에 사용되는 Code 표는 크게 2개로 나눠집니다. ANSI와, UNICODE
(1) ANSI(American National Standards Institute) 란?
- ASCII 기반으로 만들어진 표준 규격으로 언어(CodePage)마다 코드표가 따로 존재한다.
- 그래서 ANSI로 Encoding 할려면 CodePage표를 알아야 합니다. 대표 적으로 CodePage로는 CP949, EUC-KR
(2) UNICODE 란?
- 전 세계의 모든 문자를 항상 2byte 숫자로 1:1 매핑해 놓은 단일 Code표로 특정 인코딩 방식은 아닙니다.
* UNICODE를 활용한 Encoding 방식
A. UTF-8
- 한 문자를 1~4 byte를 사용하여 표시하는 가변 길이 encodnig 방식
- UTF-8은 유니코드를 위한 가변 길이 문자 Encoding(multibyte) 방식 중 하나입니다.
- ANSI의 단점을 보완하기 위해 만들어졌다.
2) Encoding 방식 종류
- Encodig 방식이란 위의 Code표를 표현하는 방식을 말합니다.
(1) ANSI의 Encoding 방식
A. EUC-KR
- ANSI를 한국에서 확장한 것이다.
- EUC-KR 코드표를 확인해보면 B0 A1에 '가'가 매핑되어있는 것을 확인할 수 있다.
B. CP949
- EUC-KR의 확장이며, 하위 호환성이 있다.
- window에서 사용합니다.
(2) UNICODE의 Encoding 방식
A. UTF-8 인코딩
- UNICODE 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다.
3) multibyte란?
- 2byte 이상으로 encoding 되는 방식을 말하는 대명사라고 보시면 됩니다.
- UTF-9 , CP949, EUC-KR 모두 multibyte encoding 방식입니다.
3) 정리
encodnig이라 함은 Code의 표를 특정한 방식에 따라 표현한 것을 말한다. Encoding 방식에 따라 사용하는 Code표가 다릅니다. 절대 혼돈하지 말하야할 것, ANSI와 UNICODE는 Encoding 방식이 아닙니다.
참조 : https://umbum.tistory.com/328
참조 : https://ju3un.github.io/encodng-unicode-ansi/
'프로그래밍 > 윈도우 프로그래밍' 카테고리의 다른 글
[cygwin] sshd no password login (linux to windows) (0) | 2023.11.09 |
---|---|
[Window10] 이 앱은 사용자 보호를 위해 차단되었습니다 (우회 방법) (16) | 2018.09.05 |
chrome(크롬) : 안전한 연결 설정중 해결 방법 (55) | 2018.08.08 |
[윈도우] FindFirstFileA를 사용한 MBCS 문자열 탐지 (0) | 2017.02.02 |
[윈도우] window 프로그래밍에서 표준 C/C++를 동시에 하용할 시 발생하는 문자열 문제점 해결 (0) | 2017.02.02 |