기본적으로 MS windows 환경에서는 MS949의 한국형 확장인 euc-kr을 사용한다. (우리가 흔히 아는 c의 char 형이 한국 윈도우에서 저 방식이다.)
하지만 자바는 2바이트 캐릭터로 문자열 처리에 무조건 유니코드를 사용하며 인코딩은 UTF-16이라고 생각하고 있었다.
byte[] dub = PACKETLIST.LOGIN.getByteHead(m_LoginName.length() + 1);
outToServer.write(PACKETLIST.LOGIN.getByteHead(m_LoginName.length() + 1));
byte[] fd= m_LoginName.getBytes();
String str = new String(m_LoginName.getBytes("MS949"), "euc-kr");
byte[] fd2= m_LoginName.getBytes("euc-kr");
String str3 = new String(m_LoginName.getBytes("euc-kr"), "UTF-16LE");
byte[] fd3= m_LoginName.getBytes("UTF-16LE");
String hex = byteArrayToHex(m_LoginName.getBytes("UTF-16LE"));
다음과 같은 더러운 실험을 했다.
여차저차해서 알게된것은 자바는 2바이트 캐릭터를 사용하여 유니코드 인코딩을 사용한다고 착각하고 있었지만, 인코딩 방식은 ANSI 표준 + euc-kr의 식이였다. (c의 char 처럼)
wchar_t는 한 변수에 유니코드 글자 하나의 코드를 포함하며, 그는 UTF-16LE와 같은 방식이다. (그냥 uft-8 하면 빅 엔디안이며, 앞 부분에 0xfffe 라는 바이트가 하나 더 붙는다.)
따라서 서버에서 wchar_t의 형식으로 받고 싶다면 ("UTF-16LE")로 변환하고 전송하면 된다.
'개발 > C++' 카테고리의 다른 글
PostThreadMessage 실패시 (1) | 2014.08.01 |
---|---|
std::thread에서 native thread 핸들 얻기 (0) | 2014.07.17 |