2022. 9. 17. 15:30

소켓 통신 라이브러리를 만들어 사용하는 중인데

'.NET' 응용프로그램에서는 문제가 없는데

유니티에서는 문자열이 깨지는 현상이 발생했습니다....????

 

 

1. 문제의 발견

서버에서는 문자열을 아스키 배열로 보내고 있습니다.

.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);

 

 

2. 해결 방법

해결 방법을 찾지 못하다가.....

아스키의 확장인 안시(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' 속성값을 확인하고 싶으면 아래 링크를 참조하면 됩니다.

참고 : EncodingInfo.CodePage 속성

 

이거 닷넷 자체 엔코더인데 이렇다는건.......

유니티에서 닷넷 구현이 다르다는 거죠 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그러니까 빨리 '.NET 5'든 '.NET 6'이든 올리라고!!!