1 분 소요

서버에서 받은 데이터를 byte[]에 문자열로 저장하고 MessageBox.Show()로 보여주려고 했더니 System.Byte[]만 계속 찍혔다. 배열을 그대로 출력하면 ToString()이 타입 이름만 돌려주기 때문이다. 명시적으로 인코딩을 지정해 변환해야 한다.

stringbyte[]로 변환하려면:

byte[] ba = System.Text.Encoding.Default.GetBytes( str );

byte[]string으로 변환하려면:

string str = System.Text.Encoding.Default.GetString( ba );

2026년 수정 안내 원래 이 글은 Encoding.Default를 그대로 쓰라고만 적혀 있었다. 그런데 이 값이 .NET Framework와 .NET Core/5+에서 서로 다른 인코딩을 가리킨다. 서버와 데이터를 주고받는 코드라면 위험한 함정이라 바로잡는다.

Encoding.Default는 실행 환경에 따라 달라진다

  • .NET Framework — 운영체제의 시스템 ANSI 코드페이지를 가리킨다. 한국어 윈도우라면 CP949(EUC-KR 확장).
  • .NET Core / .NET 5 이상 — 플랫폼 독립성을 위해 항상 UTF-8을 가리킨다.

즉 같은 코드를 .NET Framework에서 돌릴 때와 .NET 5+에서 돌릴 때 결과가 달라진다. 서버가 CP949로 인코딩해 보낸 패킷을 .NET 5+ 클라이언트가 Encoding.Default로 받으면 한글이 깨진다.

인코딩을 명시적으로 지정한다

서버와 통신하는 코드라면 프로토콜이 어떤 인코딩을 쓰는지 정해두고 그것을 명시적으로 지정해야 한다. Default에 기대면 안 된다.

// 프로토콜이 UTF-8이라고 정했다면
byte[] ba = Encoding.UTF8.GetBytes( str );
string str2 = Encoding.UTF8.GetString( ba );

// 레거시 한글 프로토콜(CP949/EUC-KR)과 맞춰야 한다면
// .NET Core/5+에서는 System.Text.Encoding.CodePages 패키지와
// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 등록이 먼저 필요하다
byte[] baKr = Encoding.GetEncoding( 949 ).GetBytes( str );

새로 만드는 프로토콜이라면 플랫폼과 언어를 가리지 않고 통용되는 UTF-8로 통일하는 것이 가장 무난하다.

참고자료

댓글 남기기