예를 들면, 폴더명이 한글인 경우 C#에서 외부 C/C++ 프로그램으로 특정 파일 경로명을 전달했다가 나중에 다시 MSMQ 등을 통해 넘겨받아 다시 재사용해야하는 경우가 있다. (좀 복잡하긴 하지만 이런 경우는 실제 상황에서는 매우 빈번한 경우다.)

 

C#에서 Default(EUC-KR) 인코딩을 써서 외부 C/C++로 한글을 전달할 때는 다행히 그대로 전달된다.

즉, "메일 서버"라는 데이터는 EUC-KR 인코딩 바이너리 형태(B8 DE C0 CF 20 BC AD B9 F6)로 전달된다.

 

C/C++ 프로그램에서 다시 MSMQ 등을 이용해 C#으로 전달할 때 두 가지 방법이 있는데, 하나는 그대로 전달하는 방법이고, 다른 하나는 유니코드로 변환해서 전달하는 방법이다. 그런데 경우에 따라(거의 대부분의 경우이지만) EUC-KR(혹은 ASCII) 인코딩 문자열을 그대로 전달하게 되면 C#에서 이를 받아 처리할 수 없게 된다. 즉, MSMQ 메시지 형식이 ActiveXFormatter로 잘 처리되려면 유니코드 문자열이어야 한다. 그래서 유니코드로 변환을 하는데, 여기서 짚고 넘어가야 할 문제가 하나 생긴다.

 

"메일 서버"라는 (B8 DE C0 CF 20 BC AD B9 F6) 값을 WCHAR 형태로 강제 변환하면 (B8 00 DE 00 C0 00 CF 00 20 00 BC 00 AD 00 B9 00 F600) 값이 되는 것이다. 원래 원하는 값은 이 값이 아니라 정상적인 유니코드 값(54 BA 7C C7 20 00 1C C1 84 BC) 인데 말이다.

 

그래서 C#에서 MSMQ를 통해 데이터를 받으면 알아볼 수 없는 이상 야릇한 깨진 문자열을 얻게 된다. 이때 다음과 같이 해주면 정상적으로 EUC-KR 인코딩 형태의 원래 문자열을 얻을 수 있다.

 

//string txt = "{MSMQ로 받은 문자열}";

byte[] bytes = Encoding.Unicode.GetBytes(txt);
byte[] converted = new byte[bytes.Length/2];
int k = 0;
for (int i = 0; i < bytes.Length; i+=2)
    converted[k++] = bytes[i];

string s = Encoding.Default.GetString(converted);

 

즉, 강제로 2바이트마다 끼어있는 '00'을 제거해주기만 하면 원래 문자열을 얻을 수 있다.


'Tech: > .NET·C#' 카테고리의 다른 글

Stack overflow?  (0) 2008.06.26
Smart Client (Web-embedded) 보안  (0) 2008.06.26
CAPICOM IL 수정하여 다시 빌드하기  (0) 2008.06.26
[펌] C#으로 MHT파일 만들기  (0) 2008.06.26
Visual Studio 2005 ASP.NET 팁  (0) 2008.06.26


Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]