Unity3D iOS에서 C++ 서버와 통신중 한글이 ???로 나올 때


 위 그림과 같이 유니티3D iOS 버전에서 C++로 된 자체 서버와 통신하는데 있어서 한글만 ???로 깨지는 이슈가 발생했습니다. 안드로이드에서는 잘 되고 있다고 하네요. 일단 서버는 멀티바이트로 처리중인 상황이라고 하구요.



if( GUI.Button( new Rect (390, 250, 70, sizeHeight ), "ATTACK" ) == true )
{
Packet.S_CR_RELAY_PACKET packet = new Packet.S_CR_RELAY_PACKET();
packet.targetUID = matchUserUID;
byte[] chatbytes = Encoding.UTF8.GetBytes(chattingstring);
packet.relayData = Convert.ToBase64String(chatbytes);
Debug.Log(packet.relayData + "__" + chattingstring);
//byte[] chatBytes=Encoding.Unicode.GetBytes(chat);
//packet.relayData = Encoding.Unicode.GetString(chatBytes);
ConnectToGameserver.GetInstance().SendPacket( packet );
}

 보낼 때 소스입니다. 처음에는 그냥 string를 Buffer.BlockCopy를 통해서 바로 보내다가 주석에 있는 것 처럼 Encoding.Unicode 로 해서 보내도 봤지만 위와 같이 보낼 스트링을 Encoding.UTF8.GetBytes 로 일단 byte[] 로 가져온 후 Convert.ToBase64String로 인코딩 처리 후 보내줘야하더군요.

void OnRecivePacket( Packet.S_RC_RELAY_PACKET packet)
{
Debug.Log(" S_RC_RELAY_PACKET - SendUser:"+packet.senderUID.ToString()+"payload="+packet.relayData);
byte[] chatBytes = Convert.FromBase64String(packet.relayData);
packet.relayData = Encoding.UTF8.GetString(chatBytes);
//Buffer.BlockCopy(packet.relayData.ToCharArray(), 0, chat, 0, packet.relayData.Length);
//packet.relayData = Encoding.Unicode.GetString(chat);
Debug.Log (" ====> " + packet.relayData);
exampleText += packet.relayData;
}

 서버에서는 그대로 다른 클라이언트에 보낸 후 클라이언트 리시브를 처리하는 부분은 위와는 반대로 Convert.FromBase64String 로 디코딩을 한 후 Encoding.UTF8.GetString로 가져오면 한글을 제대로 처리할 수 있습니다.
 


 이건 혼자 채팅 테스트 해본 거구요.

 이건 실제로 서버를 통해 채팅을 해본 것입니다.

 Base64 인코딩 디코딩은 암호화 관련해서 쓰는 줄 알았는데 C#에서는 이런 이슈도 있네요.

이 블로그의 인기 게시물

CMake Windows에 설치하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

Unity3D 안드로이드 Keystore 생성하기