소켓 통신 라이브러리를 만들어 사용하는 중인데
'.NET' 응용프로그램에서는 문제가 없는데
유니티에서는 문자열이 깨지는 현상이 발생했습니다....????
서버에서는 문자열을 아스키 배열로 보내고 있습니다.
.NET 프로그램에서는 아스키를 문자열로 바꿀 때 다음과 같은 방법을 사용합니다.
Encoding.Default.GetString(byteData);
-- 혹은 --
Encoding.ASCII.GetString(byteData);
그런데 유니티에서는 이렇게 하면 한글 아스키가 디코딩되지 않는 현상이 있습니다.
재연용 코드는 다음과 같습니다.
//byte[] ascii = System.Text.ASCIIEncoding.Default.GetBytes("가나다라");
byte[] AnsiStr = new byte[] { 0xB0, 0xA1, 0xB3, 0xAA, 0xB4, 0xD9, 0xB6, 0xF3 };
string sEncode_Default = Encoding.Default.GetString(AnsiStr);
//.NET
Debug.WriteLine("Default : " + sEncode_Default);
//Unity
Debug.Log("Default : " + sEncode_Default);
해결 방법을 찾지 못하다가.....
아스키의 확장인 안시(ANSI)로 변환해서 읽으면 어떨까 해서 해보니 됩니다;;;;
//byte[] ascii = System.Text.ASCIIEncoding.Default.GetBytes("가나다라");
byte[] AnsiStr = new byte[] { 0xB0, 0xA1, 0xB3, 0xAA, 0xB4, 0xD9, 0xB6, 0xF3 };
//ks_c_5601-1987
Encoding ANSI = Encoding.GetEncoding(949);
byte[] utf8Bytes
= Encoding.Convert(
ANSI
, Encoding.UTF8
, AnsiStr);
string utf8String = Encoding.UTF8.GetString(utf8Bytes);
//.NET
Debug.WriteLine("utf8String : " + utf8String);
//Unity
Debug.Log("utf8String : " + utf8String);
테스트 코드는 아래와 같습니다.
//byte[] ascii = System.Text.ASCIIEncoding.Default.GetBytes("가나다라");
byte[] AnsiStr = new byte[] { 0xB0, 0xA1, 0xB3, 0xAA, 0xB4, 0xD9, 0xB6, 0xF3 };
string sEncode_Default = Encoding.Default.GetString(AnsiStr);
Debug.Log("Default : " + sEncode_Default);
string sEncode_ASCII = System.Text.Encoding.ASCII.GetString(AnsiStr);
Debug.Log("sEncode_ASCII : "+ sEncode_ASCII);
Encoding ANSI = Encoding.GetEncoding(949);
byte[] ansiBytes
= Encoding.Convert(
ANSI
, Encoding.ASCII
, AnsiStr);
string ansiString = Encoding.UTF8.GetString(ansiBytes);
Debug.Log("ansiString : " + ansiString);
byte[] utf8Bytes
= Encoding.Convert(
ANSI
, Encoding.UTF8
, AnsiStr);
string utf8String = Encoding.UTF8.GetString(utf8Bytes);
Debug.Log("utf8String : " + utf8String);
'CodePage' 속성값을 확인하고 싶으면 아래 링크를 참조하면 됩니다.
이거 닷넷 자체 엔코더인데 이렇다는건.......
유니티에서 닷넷 구현이 다르다는 거죠 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
그러니까 빨리 '.NET 5'든 '.NET 6'이든 올리라고!!!