[MFC] WAS서버에 POST 파라미터 전송 시에 한글 깨짐으로 인하여 URLEncode 처리 구현 테스트 진행
WAS 서버의 기본 EncodingFilter는 UTF-8 이었습니다, euc-kr로 설정된 상태에서는 한글이 깨지지 않았습니다.
[MFC 프로젝트는 유니코드 형식 이며 Socket의 send 메서드로 multibyte로 변환 하여 전송 하고 있습니다.]
출처 : 메모장입니다. :: MFC URLEncode / URLDecode (tistory.com)
출처 : [WinAPI] MultiByteToWideChar, WideCharToMultiByte 사용 예제 (tistory.com)
출처 : [MFC] 에디터 컨트롤 글자 추가 시키기 : 네이버 블로그 (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]
감사합니다.
'C++ > MFC' 카테고리의 다른 글
[MFC] Windows Service 시작 / 중지 상태 확인 제어 예제 (0) | 2023.06.27 |
---|---|
RegOpenKeyEx 32bit 응용프로그램에서 64bit Registry 접근 예제 (0) | 2023.06.22 |
SHGetKnownFolderPath 함수 사용시에 바이러스로 인식되는 현상 (0) | 2022.10.26 |
C++에서 COM , COM+ 메서드 호출 예제 (0) | 2021.02.07 |
컴파일시에 winmain.cpp 파일에 if (!pThread->InitInstance()) 에러 발생시 조치 방안 (0) | 2018.12.13 |