본문 바로가기

TechLog

UTF8(Unicode) -> euc-kr 문자 셋으로 변환하기

UTF8(Unicode) -> euc-kr 문자 셋으로 변환하기

닷 넷에서는 기본적으로 문자열에서 유니코드 인코딩을 사용합니다. 따라서 안시 코드나 고유한 문자 셋을 사용하고 있는 프로그램들과의 호환을 위해서 내부 문자열 인코딩을 변환해주어야 할 일이 생깁니다. 보통 한국에서 많이 쓰이는 euc-kr(codepage 949) 문자 셋으로 변환하는 코드를 소개합니다.

 

 

안녕하세요 : )

 

굉장히 짧은 내용인데.. 찾다찾다 못 찾아서 직접 짧게 만든 코드를 올려봅니다.

 

 

우리 제발 통신하게 해주세요

 

Kenial 은 최근 MFC로 만들어진 API 서버와 소켓 기반으로 통신해야 하는 닷넷 기반의 클라이언트 코드를 작성한 적이 있었다. 아직 닷넷에 익숙하지 않은 상태에서 대충 System.Net.Sockets.TcpClient 객체를 가지고 네트웍 스트림을 얻어다가 string을 날려보고 했는데... 서버에서는 응답이 없었다. 네트웍 연결에는 전혀 이상이 없었고, MFC로 만든 다른 클라이언트는 잘 동작했다. 잠시 msdn과 기타 서적을 찾아본 후 내린 결론은 :

 

    내가 짠 닷넷 클라이언트는 유니코드 문자열을 전송하고 있다

 

그렇다면, '기존 레거시 환경과의 유연한 통합'을 제공하고 있는 닷넷이니만큼 인코딩과 관련한 어셈블리가 있지 않을까. 물론 그런 어셈블리가 존재했고, Kenial은 그것을 이용해 다음과 같은 짧은 코드를 만들었다

 

 

 

 

using System.Text;
..
string strSendText = "
전송할 메시지";
byte[] pbSource = Encoding.UTF8.GetBytes(strSendText);
byte[] pbDest = Encoding.Convert(
   Encoding.UTF8, Encoding.GetEncoding("euc-kr"), pbSource);
pbSource = Encoding.Convert(Encoding.GetEncoding("euc-kr"), Encoding.UTF8, pbDest);
char[] psUnicode = UTF8Encoding.UTF8.GetChars(pbSource);
string strReceiveText = new string(psUnicode);

 

 

 

 

 

코드를 보면 쉽게 이해가 가리라 믿는다.

 

 

 

 

 

1. 기본적으로 UTF8(유니코드)로 인코딩된 기존 문자열의 바이트 배열을 받아오고(pbSource)

2. 해당 바이트 배열을 euc-kr 문자 셋으로 변환해서 바이트 배열에 담는다. (pbDest)

3. 그 다음엔 euc-kr 문자 셋으로 변환된 바이트 배열을 다시 Unicode 문자 세트의 바이트 배열에 변환해서 집어넣고 (pbSource)

4. 바이트 배열로부터 문자열 배열을 얻는다 (psUnicode)

5. 그 다음 문자열 배열로부터 string 객체를 만든다 (strReceiveText)

 

 

 

 

 

여 기서 부가적으로 설명할 부분은 4. 인데, 닷넷에서 char 타입은 1바이트가 아닌 2바이트의 크기를 갖는다. 이는 유니코드 문자를 처리하기 위해서이다. 따라서 예전 c/c++에서 byte 배열을 캐스트 연산만으로 char 배열로 변환하는 것은 불가능해졌고, encoding 관련 메서드를 사용해야 변환이 가능하게 되었다.

 

 

정리

 

혹 시 Kenial처럼 소켓 기반 네트웍 클라이언트를 만들어야 하는 분들을 위해 첨언하자면, 위와 같은 과정을 통해 얻어진 pbSource 바이트 배열은 "문자열"로 취급되지 않으므로 배열의 끝에 널(0) 문자가 추가되지 않습니다. 배열의 크기를 +1 로 잡아서 끝에 널 문자를 추가하거나, 널 문자만을 따로 전송해야 할 것입니다.

 

그럼 : )