프로그래밍/윈도우 프로그래밍

[윈도우] window 프로그래밍 한글 처리 c++

jinkwon.kim 2019. 9. 29. 23:08
728x90
반응형

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

 

Encoding 정리. Unicode, ANSI, UTF, CP949

Unicode 특정 encoding 방식을 가리키는 말이 아니라 순서(U+????)와 문자를 1:1로 매핑해놓은 하나의 코드표를 가리킨다. 이 문자(U+C548, 안)을 어떤 바이너리 데이터로 매핑할 것인가?를 결정하는 것이 UTF-8이..

umbum.tistory.com

참조 : https://ju3un.github.io/encodng-unicode-ansi/

 

인코딩(Encoding) - ASCII, ANSI, Multi-Byte, Unicode 등 - (1)

1. 아스키(ASCII) 코드 (American Standart Code for Information Interchage)의 약자 컴퓨터는 숫자(0과…

ju3un.github.io

 

728x90
반응형