본문 바로가기
C++/MFC

[MFC] WAS서버에 POST 파라미터 전송 시에 한글 깨짐으로 인하여 URLEncode 처리 구현 테스트 진행

by Hwoarang757 2023. 3. 2.

[MFC] WAS서버에 POST 파라미터 전송 시에 한글 깨짐으로 인하여 URLEncode 처리 구현 테스트 진행 

 

WAS 서버의 기본 EncodingFilter는 UTF-8 이었습니다, euc-kr로 설정된 상태에서는 한글이 깨지지 않았습니다.

[MFC 프로젝트는 유니코드 형식 이며 Socket의 send 메서드로 multibyte로 변환 하여 전송 하고 있습니다.]

 

출처 : 메모장입니다. :: MFC URLEncode / URLDecode (tistory.com)

 

MFC URLEncode / URLDecode

inline BYTE CURLEncode::toHex(const BYTE &x) { return x > 9 ? x + 55: x + 48; } inline BYTE CURLEncode::toByte(const BYTE &x) { return x > 57? x - 55: x - 48; } CString CURLEncode::URLDecode(CString sIn) { CString sOut; const int nLen = sIn.GetLength() + 1

wyseburn.tistory.com

출처 : [WinAPI] MultiByteToWideChar, WideCharToMultiByte 사용 예제 (tistory.com)

 

[WinAPI] MultiByteToWideChar, WideCharToMultiByte 사용 예제

MultiByte, WideChar 변환에 대해 알아보겠습니다. 1. MultiByte에서 WideChar 변환 int MultiByteToWideChar( UINT CodePage, // 코드페이지(CP_ACP) DWORD dwFlags, // 플래그 _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr, // MultiByte int

3001ssw.tistory.com

출처 : [MFC] 에디터 컨트롤 글자 추가 시키기 : 네이버 블로그 (naver.com)

 

[MFC] 에디터 컨트롤 글자 추가 시키기

[문제] GetWindowTextW나 SetWindowTextW 함수를 사용할 시에는 포커스에 문제가 발생할 수 있음 [...

blog.naver.com

 

URLEncode 방법에 대한 부분을 유니코드 형식을 찾지 못하였습니다 , WideCharToMultiByte를 이용하여 URLEncode 처리를 진행 하였습니다. 출처의 메서드를 인용 하였습니다.

 

* 2023.03.07 내용 추가 -> UTF-8 형식으로 인코딩 하는 방법을 찾았습니다!!!

 

1. URLEncoding 부분 

inline BYTE CURLEncode::toHex(const BYTE& x) {
	return x > 9 ? x + 55 : x + 48;
}

inline BYTE CURLEncode::toByte(const BYTE& x) {
	return x > 57 ? x - 55 : x - 48;
}


char* CURLEncode::URLEncode(char* sIn) {
	//CString sOut;
	char sOut[1024];
	//const int nLen = sIn.GetLength() + 1;
	const int nLen = strlen(sIn) + 1;
	register LPBYTE pOutTmp = NULL;
	LPBYTE pOutBuf = NULL;
	register LPBYTE pInTmp = NULL;
	//LPBYTE pInBuf = (LPBYTE)sIn.GetBuffer(nLen);
	LPBYTE pInBuf = (LPBYTE)sIn;
	//alloc out buffer
	//pOutBuf = (LPBYTE)sOut.GetBuffer(nLen * 3);
	pOutBuf = (LPBYTE)sOut;

	if (pOutBuf) {
		pInTmp = pInBuf;
		pOutTmp = pOutBuf;
		// do encoding
		while (*pInTmp) {
			if (isalnum(*pInTmp) || '-' == *pInTmp || '_' == *pInTmp || '.' == *pInTmp)
				*pOutTmp++ = *pInTmp;
			else if (isspace(*pInTmp))
				*pOutTmp++ = '+';
			else {
				*pOutTmp++ = '%';
				*pOutTmp++ = toHex(*pInTmp >> 4);
				*pOutTmp++ = toHex(*pInTmp % 16);
			}
			pInTmp++;
		}
		*pOutTmp = '\0';
		//sOut.ReleaseBuffer();
	}
	//sIn.ReleaseBuffer();

	return sOut;
}

 

2. WideCharToMultiByte 를 이용하여 , Encoding 된 값을 획득 후에 , 다시 MultiByteToWideChar 를 이용하여 유니코드 형식으로 변환 하였습니다. 

void CUniCodeTestDlg::UniCodeTest() {
	FILE* f;
	CURLEncode uriEncode;
	
	_wfopen_s(&f , _T("D:\\project\\cpp_project\\test\\utf8test.ini"), _T("rt,ccs=UTF-8"));
	wchar_t buf[1024];
	
	CEdit* edit = (CEdit*)GetDlgItem(IDC_EDIT1);

	int nLen = 0;
	char szMultiByte[1024];
	
	CString strConv;
	

	if (f != NULL) {
		while (fgetws(buf, 1024, f) != NULL) {
			OutputDebugString(buf);
			AppendTextEdit(*edit, buf);
			
            
            // * CP_ACP 로 인코딩 시에 URLEncode는 euc-kr charset으로 인코딩 됩니다..
			nLen = WideCharToMultiByte(CP_ACP, 0, buf, -1, NULL, 0, NULL, NULL);
			WideCharToMultiByte(CP_ACP, 0, buf, -1, szMultiByte, nLen, NULL, NULL);

            // * CP_UTF8 로 인코딩 시에 URLEncode는 utf-8 charset으로 인코딩 됩니다..
            /*
			nLen = WideCharToMultiByte(CP_UTF8, 0, buf, -1, NULL, 0, NULL, NULL);
			WideCharToMultiByte(CP_UTF8, 0, buf, -1, szMultiByte, nLen, NULL, NULL);
            */

			char* szEncoded = uriEncode.URLEncode(szMultiByte);

			nLen = MultiByteToWideChar(CP_ACP, 0, szEncoded, -1, NULL, NULL);
			wchar_t *wszConv = new wchar_t[nLen];
			memset(wszConv, 0x00, nLen);
			MultiByteToWideChar(CP_ACP, 0, szEncoded, -1, wszConv, nLen);
			
			strConv.Format(_T("%s"), wszConv);
			
			if (wszConv)
				delete[] wszConv;

			AppendTextEdit(*edit, strConv);

		}
	}
	
	OutputDebugString(_T("완료"));
}

void CUniCodeTestDlg::AppendTextEdit(CEdit& edit, CString strText) {

	CString strAppend;
	
	strAppend.Format(_T("%s\r\n"), strText);

	int nLength = edit.GetWindowTextLength();
	edit.SetSel(nLength, nLength);
	edit.ReplaceSel(strAppend);

}

3. MultiByte 문자열 값에 대한 URLEncode를 이용한 한글 값에 대한 인코딩 테스트 시에 아래와 같이 출력 되었습니다

* CP_UTF8 로 인코딩 시에 UTF-8 형식으로 인코딩 되는 것을 확인 하였습니다.

 

 

4. JAVA WAS에서 URLEncode 테스트 시에 아래와 같이 출력 되었습니다.

    public void testEncoding(HttpServletRequest request ,HttpServletResponse response) throws Exception {
        String methodName = new Exception().getStackTrace()[0].getMethodName();
        log.info(String.format("%s EncodeString=[%s]", methodName ,
                URLEncoder.encode("USERNM=홍길동", "utf-8")
                ));

        log.info(String.format("%s EncodeString=[%s]", methodName ,
                URLEncoder.encode("USERNM=홍길동", "euc-kr")
                ));
    }
    
    //////////////////결과
    //UTF-8 
    testEncoding EncodeString=[USERNM%3D%ED%99%8D%EA%B8%B8%EB%8F%99]
    //EUC-KR
    testEncoding EncodeString=[USERNM%3D%C8%AB%B1%E6%B5%BF]

 

감사합니다.