소켓통신은 1바이트 단위로 전송해야 하기 때문에 한글과 같은 애들은 통신에 적합하도록 인코딩한 후에 수신측에서는 이를 다시 디코딩해야 한다.
1. 파이선 (전송부)
- 본인은 Unicode가 기본으로 설정되어 있어서 UTF-8로 바로 인코딩해서 사용했다.
#-*- coding: utf-8 -*-
import socket
HOST = '127.0.0.1' # The remote host
PORT = 50007 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
testData = '한글테스트'
testData = testData.encode('utf-8')
s.sendall(testData)
data = s.recv(1024)
s.close()
print('Received', repr(data))
2. VC++ (수신부)
- 소켓 서버에서 받아진 buffer의 포인터를 아래 함수의 입력 szUtf8로 넣어주면 CString 값으로 리턴된 값을 사용할 수 있다.
CString UTF2Cstring(char* szUtf8)
{
BSTR bstrWide;
char* pszAnsi;
int nLength;
// wide char 크기구하기
nLength = MultiByteToWideChar(CP_UTF8, 0, szUtf8, (int)strlen(szUtf8) + 1,
NULL, NULL);
bstrWide = SysAllocStringLen(NULL, nLength);
// UTF-8 -> Unicode (UTF-16)
MultiByteToWideChar(CP_UTF8, 0, szUtf8, (int)strlen(szUtf8) + 1, bstrWide,
nLength);
// multi byte 크기구하기
nLength = WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, NULL, 0, NULL, NULL);
pszAnsi = new char[nLength];
// Unicode -> multi byte
WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL);
SysFreeString(bstrWide);
// 결과string
CString tempString;
tempString = (LPSTR)pszAnsi;
// 메모리헤제
//delete[] szUtf8;
delete[] pszAnsi;
return tempString;
}